1. Analyse du principe de téléchargement de fichiers
1. Les conditions préalables nécessaires pour le téléchargement de fichiers
un. La méthode du formulaire doit être publiée
né La propriété ENCTYPE du formulaire doit être de type multiparte / forme de forme.
ENCTYPE Valeur par défaut: Application / X-WWW-FORM-URLENCODED
Fonction: Dites au serveur le type MIME du texte de la demande
application / x-www-form-urlencoded: username = abc & mot de passe = 123
ServleRequest.getParameter (nom de chaîne); Cette méthode est une méthode qui lit spécifiquement ce type
Multipart / Form-Data:
2. Utilisez le composant Commons-FileUpload pour télécharger des fichiers
un. Copier le package JAR: commons-fileupload.jar commons-io.jar
né Principe de mise en œuvre
3. Problème de code des ordures
un. Code des ordures des champs ordinaires
FileItem.getString (String Charset); L'encodage doit être cohérent avec le client
né Le nom de fichier chinois téléchargé est brouillé.
request.SetcharAtterencoding ("UTF-8"); L'encodage doit être cohérent avec le client
4. Implémentation spécifique
Le code de la réception upload.jsp est le suivant
<% @ page Language = "Java" import = "java.util. *" Pageencoding = "utf-8"%> <! Doctype html public "- // w3c // dtd html 4.01 transitional // en"> <html> content = "no-cache"> <meta http-equiv = "cache-control" contenu = "no-cache"> <meta http-equiv = "expires" contenu = "0"> <! - <link rel = "stylesheet" type = "text / css" href = "styles.css"> -> </ head> <gody> Action = "$ {pagecontext.request.contextPath} / servlet / uploadServlet3" Method = "Post" ENCTYPE = "multipart / form-data"> name: <entrée name = "name" /> <br/> File1: <entrée type = "file" name = "f1" /> <br/> File2: <puty type = "file" file " value = "upload"> </ form> </ body> </html>Code du servlet de fond
package com.itheima.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.io.usupportdencodingException; import java.util.list; javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskfileItemfactory; import org.apache.commons.fileupload.servlet.servletfilepload; import org.apache.commons.iser3 étend httpServlet {public void doGet (httpServLetRequest request, httpservletResponse réponse) lève ServletException, ioException {request.SetcharAtterencoding ("utf-8"); réponse.SetContentType ("text / html; charset = utf-8"); printwriter Out Out = Response.getWriter (); System.out.print (request.getReMoteadDr ()); boolean ismultupart = servletFileUpload.ismulTipartContent (demande); if (! Ismultupart) {Throw New RuntimeException ("Veuillez vérifier la propriété enctype de votre formulaire pour confirmer qu'il est multipart / formulaire");} disskfileitet DiskfileItemfactory (); servletFileUpload parser = new ServletFileUpload (dfif); // Parser.SetFilesizEMax (3 * 1024 * 1024); // définit la taille d'un seul fichier upload // PARSER.SETSIZEMAX (6 * 1024 * 1024); // Limite totale de taille {items = parser.paSeRequest (request);} catch (fileuploadbase.fileSizelitexechedException e) {out.write ("uploadfile dépasse 3m"); return;} catch (fileuploadbase.SizelimitexceedException e) {out.write ("File total dépasse 6m"); {e.printStackTrace (); Jetez un nouveau RuntimeException ("le contenu de téléchargement de l'analyse a échoué, veuillez réessayer");} // traite le contenu demandé if (items! = null) {for (FileItem item: items) {if (item.isformField ()) {processFormField (item);} else {processUpLoadField (item);}}} out.write ("uploded Successfricoly! item) {try {string filename = item.getName (); // if (filename! = null &&! filename.equals ("")) {filename = uuid.randomuuid (). toString () + "_" + filenameUtils.getName (filename); // extension extension de chaîne = filenameutils.geteXension (filename); // extension extension de chaîne = filenameutils.getextender (fileName); String contentType = item.getContentType (); if (contentType.startswith ("image /")) {// date now = new Date (); // dateFormat df = new SimpledateFormat ("yyyy-mm-dd"); // // string childdirectory = df.format (maintenant); // calculate childDirectory = makechildDirectory (getServletContext (). getRealPath ("/ web-inf /"), filename); string storedirectoryPath = getServletContext (). getRealPath ("/ web-inf / files /" + childdirectory); file storedirectory = new file (storedirectorypath); if (! storedirectory.exists ()) {storedirectory.mkDirs ();} System.out.println (nom de fichier); Calculez le sous-répertoire stocké String privé MakeChildDirectory (String realPath, String FileName) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // prendre 1 ~ 4 bits int d2 = (hashcode & 0xf0) >> 4; // prendre 5 ~ 8 bits directeurs de chaîne = "" + dir1 + file. file = new File (realPath, répertoire); if (! file.exists ()) file.mkDirs (); return Directory;} private void processFormField (fileItem item) {String FieldName = item.getFieldName (); // Nom de champ String FieldValue; Try {fieldValue = item.getString ("utf-8");} catch (unsUpporTeden Nouveau RuntimeException ("UTF-8 L'encodage n'est pas pris en charge");} System.out.println (FieldName + "=" + FieldValue);} public void DOPOST (HttpServletRequest Request, HttpServletResponse Response) lance ServLetException, ioException {doget (demande, réponse);}}5. Concernant les documents temporaires
un. DiskfileItemfactory
public void setRepository (Référentiel de fichiers): Définissez le répertoire où les fichiers temporaires sont stockés publics SetSizethReshold (int sizethreshold): définissez la taille du cache
né
Lors du téléchargement de fichiers, utilisez IO Stream pour les traiter vous-même. Assurez-vous de supprimer le fichier temporaire après la fermeture du flux. FileItem.delete ()
Il est recommandé d'utiliser: fileItem.writer (fichier f). Les fichiers temporaires seront supprimés automatiquement.
6. Limiter la taille du fichier
un.
ServletFileUpload.SetFileSizEMax (3 * 1024 * 1024); // définir la taille d'un seul fichier téléchargement
né
ServletFileUpload.SetSizEMax (6 * 1024 * 1024); // Limite de taille totale lors du téléchargement de plusieurs fichiers
Ce qui précède est l'exemple de code pour le téléchargement de fichiers d'implémentation de fichiers Commons Fileupload introduit par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!