Le téléchargement de fichiers est très courant dans les applications Web. Il est très facile d'implémenter la fonction de téléchargement de fichiers dans l'environnement JSP, car de nombreux composants de téléchargement de fichiers sont développés en Java sur Internet. Cet article prend le composant Commons-FileUpload à titre d'exemple pour ajouter une fonction de téléchargement de fichiers sur les applications JSP.
Le composant Common-FileUpload est l'un des projets open source d'Apache et peut être téléchargé à partir de http://jakarta.apache.org/commons/fileupload/.
Ce composant vous permet de télécharger un ou plusieurs fichiers à la fois et peut limiter la taille du fichier.
Après le téléchargement, dézip le package zip et copiez Commons-fileupload-1.0.jar sur les webapps de Tomcat sous votre webappweb-inflib. Si le répertoire n'existe pas, veuillez créer votre propre répertoire.
Créez un nouveau servlet: upload.java pour le téléchargement de fichiers:
importer java.io. *; import java.util. *; Importer Javax.servlet. *; import javax.servlet.http. *; import org.apache.commons.fileupload. *; La classe publique Téléchargement étend httpServlet {private String uploadPath = "c: upload"; // Répertoire de téléchargement de fichiers private string temppath = "c: uploadtmp"; // Répertoire de fichiers temporaire public void doPost (demande httpservletRequest, réponse httpservletResponse) lance ioException, servlexception {}}Dans la méthode doPost (), lorsque le servlet reçoit la demande de poste émise par le navigateur, il réalise le téléchargement de fichiers. Voici l'exemple de code:
public void doPost (requête httpservletRequest, réponse httpservletResponse) lève ioException, servlexception {try {diskfileupload fu = new diskfileupload (); // Définit la taille maximale du fichier, voici 4MBFU.SetSizEMax (4194304); // définit la taille du tampon, voici 4kbfu.SetSizethReshold (4096); // Définit le répertoire temporaire: fu.setRepositoryPath (TEMPPATH); // obtient tous les fichiers: list fileItems = fu.parsErequest (request); Iterator i = fileItems.iterator (); // traite chaque fichier en séquence: while (i.hasnext ()) {fileItem fi = (fileItem) i.next (); // Obtenez le nom du fichier, le nom de fichier inclut le chemin: String filename = fi.getName (); // Ici, vous pouvez enregistrer des informations d'utilisateur et de fichier // ... // Écrivez dans le fichier, le nom de fichier provisoire est a.txt, et le nom de fichier peut être extrait du nom de fichier: fi.write (nouveau fichier (uploadPath + "a.txt")); }} catch (exception e) {// Vous pouvez sauter sur la page d'erreur}}Si vous souhaitez lire le dossier de téléchargement spécifié dans le fichier de configuration, vous pouvez l'exécuter dans la méthode init ():
public void init () lève ServletException {uploadPath = ... if (! nouveau fichier (temppath) .isDirectory ()) nouveau fichier (temppath) .mkDirs (); }Compilez le servlet, veillez à spécifier le chemin de classe, assurez-vous d'inclure Commons-upload-1.0.jar et tomcatcommonlibservlet-api.jar.
Configurez le servlet, utilisez le bloc-notes pour ouvrir TomCatWebApps pour votre webappweb-infweb.xml et créez-en un, sinon.
Les configurations typiques sont les suivantes:
〈? Xml version = "1.0" Encoding = "ISO-8859-1"?〉 〈! Doctype Web-Appublic "- // Sun Microsystems, Inc.//dtd Application Web 2.3 // en "" http://java.sun.com/dtd/web-app_2_3.dtd "> 〈web-app> 〈servlet> 〈servlet-name> upload 〈/ servlet-name> 〈servlet-class> upload 〈/ s Ervlet-Class> 〈servlet-mapping 〈Servlet-name> upload 〈/ servlet-name> 〈Url-sattern〉 / fileupload 〈/ url-sattern 〈/ servlet-mapping 〈/ web-app 〈〈
Après avoir configuré le servlet, démarrez Tomcat et écrivez un test HTML simple:
〈Form action = "fileupload" metheth = "post" EncType = "multipart / form-data" name = "form1"> 〈input type = "file" name = "file"> 〈input = "soumi" name = "soume" value = "upload"> 〈/ form>
Remarque Action = "Fileupload" où Fileupload est le schéma d'URL spécifié lors de la configuration du servlet.
Voici le code pour une crevette:
Ce téléchargement est beaucoup plus facile à utiliser que SmartUpload. Il a été entièrement créé par moi octets un par un, contrairement à SmartUpload qui a de nombreux bogues.
Méthode d'appel:
Télécharger up = new upload (); up.init (demande); / ** peut appeler setSavedir (String Savedir); Définissez le chemin de sauvegarde et les appels setMaxFileSize (taille longue) pour définir l'octet maximal du fichier téléchargé. Appelez SettagFileName (String) pour définir le nom du fichier après le téléchargement (uniquement valide pour le premier fichier) * / up. uploadFile ();
Alors string [] names = up.getFileName (); Obtenez le nom du fichier téléchargé, le chemin absolu du fichier doit être
Annuaire enregistré SAVEDIR + "/" + noms [i];
Vous pouvez obtenir le texte téléchargé ou up.getParameTervalues ("Filed") via up.getParameter ("champ");
Obtenez les valeurs des champs avec le même nom, tels que plusieurs cases à cocher.
Essayez les autres vous-même.
Le code source est le suivant: __________________________________________________________________________
package com.inmsg.beans; importer java.io. *; import java.util. *; Importer Javax.servlet. *; import javax.servlet.http. *; classe publique upload {private string savedir = "."; // Chemin pour enregistrer le fichier Private String ContentType = ""; // Type de document Private String charSet = ""; // Set de caractères private arrayList tmpFileName = new ArrayList (); // Structure de données temporaire pour le stockage des noms de fichiers Paramètre de hashtable privé = new HashTable (); // Structure de données qui stocke les noms et valeurs des paramètres de servletContext Contexte; // Contexte de programme, utilisé pour initialiser la demande privée httpsservletRequest; // Instance utilisée pour passer dans la demande de demande de chaîne privée Boundary = ""; // Sépréteur de données de mémoire private int len = 0; // Longueur d'octet lu en fait à chaque fois que la question de la chaîne privée; Count int privé; // Nombre total de fichiers téléchargés String privé [] nom de fichier; // Nom de fichier téléchargé Array Private Long MaxFileSize = 1024 * 1024 * 10; // les octets de téléchargement de fichiers maximum; String privé tagFileName = ""; public final void init (httpServLetRequest request) lève Servlexception {this.request = request; Boundary = request.getContentType (). substring (30); // Obtenez le Data Delimiter QueryString = request.getQueryString (); } public String getParAmètre (String S) {// Utilisé pour obtenir la valeur du paramètre du champ spécifié, Override request.getParameter (String S) if (Paramètre.iSempty ()) {return null; } return (string) Paramètre.get (s); } public String [] getParameTervalues (String S) {// Utilisé pour obtenir le tableau de paramètres spécifié avec le même champ de nom, Override request.getParameTervalues (String S) arrayList al = new ArrayList (); if (paramètre.iSempty ()) {return null; } Énumération e = paramètre.Keys (); while (e.hasmoreElements ()) {String key = (String) e.NextElement (); if (-1! = key.indexof (s + "||||||||||") || key.equals (s)) {al.add (paramètre.get (key)); }} if (al.size () == 0) {return null; } String [] value = new String [al.size ()]; for (int i = 0; i 〈value.length; i ++) {value [i] = (String) al.get (i); } RETOUR-valeur; } public String getQueryString () {return QueryString; } public int getCount () {return count; } public String [] getFileName () {return filename; } public void setMaxFileSize (Long Size) {maxFileSize = size; } public void SettagFileName (String FileName) {TagFileName = FileName; } public void setsavedir (String Savedir) {// Définissez le chemin pour enregistrer pour télécharger le fichier this.savedir = savedir; Fichier testdir = nouveau fichier (SAVEDIR); // Pour vous assurer que le répertoire existe, s'il n'y a pas, créez le répertoire if (! Testdir.exists ()) {testdir.mkdir (); }} public void setCharSet (String Charset) {// Définit les caractères set this.charset = charset; } public boolean uploadFile () lève ServletException, ioException {// Méthode de téléchargement appelée par l'utilisateur setCharset (request.getCharacTerencoding ()); return uploadFile (request.getInputStream ()); } private boolean uploadfile (servleTinputStream servletinputStream) lance // la méthode principale pour obtenir des données de stockage centrales servletException, ioException {String line = null; octet [] tampon = nouveau octet [256]; while ((line = readLine (tampon, servletinputStream, charset))! = null) {if (line.startswith ("Content-Disposition: form-data;"))) {int i = line.indexof ("filename ="); if (i〉 = 0) {// s'il y a filename = dans la description dans un délimiteur, cela signifie qu'il s'agit du contenu codé de la chaîne de fichiers fname = getFileName (ligne); if (fname.equals ("")) {continue; } if (count == 0 && tagFileName.Length ()! = 0) {String ext = fname.substring ((fname.LasTindexof (".") + 1)); fname = tagfilename + "." + ext; } tmpFileName.add (fName); Count ++; while ((line = readline (tampon, servletinputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} Fichier f = nouveau fichier (SAVEDIR, fNAME); FileoutputStream dos = new FileOutputStream (f); taille longue = 0l; while ((line = readline (tampon, servletinputStream, null))! = null) {if (line.indexof (limite)! = -1) {break; } taille + = len; if (size〉 maxFileSize) {Throw New IoException ("Fichier dépasse" + MaxFileSize + "Byte!"); } dos.write (tampon, 0, len); } dos.close (); } else {// Sinon, c'est le contenu de la chaîne de codage de champ Key = getKey (line); String value = ""; while ((line = readline (tampon, servletinputStream, charset))! = null) {if (line.length () 〈= 2) {break; }} while ((line = readline (tampon, servletinputStream, charset))! = null) {if (line.indexof (limite)! = -1) {break; } valeur + = ligne; } put (key, value.trim (), paramètre); }}} if (queyString! = null) {String [] e chaque = split (queysstring, "&"); for (int k = 0; k 〈e chaque.length; k ++) {string [] nv = split (chaque [k], "="); if (nv.length == 2) {put (nv [0], nv [1], paramètre); }}} filename = new String [tmpFileName.size ()]; for (int k = 0; k 〈filename.length; k ++) {filename [k] = (string) tmpFileName.get (k); // Déversez le nom de fichier temporaire dans ArrayList dans les données que l'utilisateur peut appeler} if (filename.length == 0) {return false; // Si les données de nom de fichier sont vides, cela signifie qu'aucun fichier n'est téléchargé} renvoie true; } private void put (clé de chaîne, valeur de chaîne, hashTable ht) {if (! ht.ContainsKey (key)) {ht.put (key, value); } else {// Si vous avez déjà une clé avec le même nom, vous devez renommer la clé actuelle. En même temps, veillez à ne pas former le même nom que KEY try {thread.currentThread (). Sleep (1); // afin de ne pas générer deux touches identiques dans le même MS} catch (exception e) {} key + = "||||||||||||" + System.CurrentTimeMillis (); ht.put (clé, valeur); }} / * Appelez servletinputStream.readline (byte [] b, into offset, longueur), qui lit une ligne du flux servletinputStream vers le tableau d'octet spécifié. Afin de s'assurer qu'il peut s'adapter à une ligne, l'octet [] B ne doit pas être inférieur à 256. Dans la ligne de lecture réécrite, une variable de membre LEN est appelée au nombre réel d'octets lus (certaines lignes sont inférieures à 256). Lors de l'écriture du contenu du fichier, l'octet de la longueur LEN doit être écrit à partir du tableau d'octets au lieu de la longueur entière de l'octet []. Cependant, la méthode réécrite renvoie la chaîne pour analyser le contenu réel et ne peut pas renvoyer LEN, donc Len est défini en tant que variable de membre et y attribuez la longueur réelle à chaque fois l'opération de lecture. C'est-à-dire que lors du traitement du contenu du fichier, les données doivent être renvoyées sous la forme de chaîne pour analyser les marques de début et de fin, et également écrites dans le flux de sortie du fichier sous forme d'octet [] en même temps. * / Private String readline (byte [] lineByte, servletinputStream servleTinputStream, String charSet) {try {len = servletinputStream.readline (lineByte, 0, lineByte.length); if (len == -1) {return null; } if (charset == null) {return new String (lineByte, 0, len); } else {return new String (lineByte, 0, len, charset); }} catch (exception _ex) {return null; }} chaîne privée getFileName (line string) {// sépare le nom de fichier de la chaîne description if (line == null) {return ""; } int i = line.indexof ("filename ="); line = line.substring (i + 9) .trim (); i = line.LastIndexof (""); if (i 〈0 || i〉 = line.length () - 1) {i = line.lastIndexof ("/"); if (line.equals ("" "")) {return ""; } if (i 〈0 || i〉 = line.length () - 1) {return Line; }} return line.substring (i + 1, line.length () - 1); } private String getKey (string line) {// sépare le nom de champ de la chaîne description if (line == null) {return ""; } int i = line.indexof ("name ="); line = line.substring (i + 5) .trim (); return line.substring (1, line.length () - 1); } public static String [] Split (String strob, string mark) {if (strob == null) {return null; } StringTokenizer st = new StringTokenizer (strob, mark); ArrayList tmp = new ArrayList (); tandis que (St.Hasmoretokens ()) {tmp.add (St.NextToken ()); } String [] starr = new String [tmp.size ()]; for (int i = 0; i 〈tmp.size (); i ++) {starr [i] = (string) tmp.get (i); } return starr; }} Le téléchargement est en fait très simple. Tant que vous le traitez comme suit, aucun problème ne se produira. Public Void Download (String Filepath, HttpServletResponse Response, boolean iSonline) lève une exception {fichier f = nouveau fichier (filepath); if (! f.exists ()) {Response.Senderror (404, "Fichier introuvable!"); retour; } BufferedInputStream br = new BufferedInputStream (new FileInputStream (f)); octet [] buf = nouveau octet [1024]; int len = 0; réponse.RESET (); // Il est très important si (iSonline) {// ononopen méthode url u = new url ("file: ///" + filepath); réponse.setContentType (U.OpenConnection (). GetContentType ()); Response.sethEader ("Content-Disposition", "inline; filename =" + f.getName ()); // Le nom de fichier doit être codé sous la forme utf-8} else {// pure download method toit.setContentType ("application / x-msdownload"); Response.sethEader ("Content-Disposition", "attachement; filename =" + f.getName ()); } OutputStream Out = Response.getOutputStream (); while ((len = br.read (buf))〉 0) out.write (buf, 0, len); br.close (); out.close (); }