Le téléchargement de fichiers Web utilise la publication. Contrairement aux formulaires de soumission de la publication, le téléchargement de fichiers nécessite de définir l'attribut encType du formulaire au multipart / formulaire de forme. Étant donné que les fichiers téléchargés seront relativement importants, ce paramètre doit être défini pour spécifier que le navigateur utilise le téléchargement binaire. Si elle n'est pas définie, la propriété ENCTYPE est par défaut à Application / X-WWW-FORM-URLENCODED. L'utilisation du navigateur utilisera ASCII pour envoyer des données au serveur, ce qui entraînera le défaut d'envoyer le fichier.
Pour télécharger un fichier, utilisez le domaine de fichier (<entrée type = 'file' /> et définissez le formulaire ENCType sur multipart / formulaire de formulaire.
La page de téléchargement du client est indiquée sur la figure:
Le code est le suivant:
upload.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>Upload file</title><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="this is my page"><meta http-equiv = "content-type" content = "text / html; charset = utf-8"> <link rel = "Stylesheet" type = "text / css" href = "css / style.css"> </ head> <body> <form action = servlet / uploadServlet "méthode =" post "enctype =" multipart / formulaire "> < Align = "Center"> <br/> <FieldSet> <Legend> Téléchargez le fichier </GENEND> <br/> <div class = 'line'> <div align = 'Left'> upload file 1 </v> <div Align = 'Left'> <Input type = "file" name = "file1"> </v> </ div> <div class = 'line'> <v align = 'Left' * Align = 'Left'> télécharger le fichier 2 </ div> <div align = 'Left'> align = 'Left'> <input type = "file" name = "file2"> </ div> </ div> <div class = 'line'> <div align = 'Left'> upload file Description 1 </ div '> <div> <div> <div class = "text" name = "description1"> </ div> <div'> <put type = "text" Name = "Description1"> </ Div> <div> <div class = "text" name1 <div align = 'Left'> Fichier de téléchargement Description 2 </ div> <div align = 'Left'> <input type = "text" name = "Description2"> </ div> </ div> <div class = 'line'> <div align = 'Left'> Fichier de téléchargement 2 </div> <div align = 'Left'> </v> <div Align = 'Left'> <br/> </div> </div> </ fieldset> </div> </ form> </ body> </html>
Le code exécuté par le client est très simple et le serveur est plus compliqué. Pour obtenir le contenu, la demande soumise par le navigateur doit être analysée en fonction du format spécifié par le protocole HTTP.
Il est plus difficile de analyser les cours d'eau binaires. De nombreuses bibliothèques de classe ont déjà terminé ce travail. Par exemple, SmartUpload et Apache Commons Fileupload.smartupload sont une bibliothèque de classe commerciale. Les données sont stockées en mémoire lors de l'analyse du processus de demande, donc elle est plus rapide, mais le débordement de la mémoire se produit lors du téléchargement de fichiers plus grands. Apache Commons Fileupload est une bibliothèque de classe gratuite et open source. Certains cadres tels que Struts intègrent la bibliothèque de classe de fichiers commune Apache pour implémenter les téléchargements de fichiers.
Comme indiqué sur la figure:
Le code est le suivant:
package com.helowenvsfei.servlet; import java.io.file; import java.io.fileoutputStream; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; import java.io.printil.liter; import java.net.urlencoder; import Java.litil.lite; import; javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httSservletRequest; import org.apache.commons.fileupload.fileItem; import org.apache.commons.fileupload.fileuploadexception; public class uploadServlet étend httpservlet {private static final SerialVersionUID = 7523024737218332088l; public void doGet (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {réponse.SetcharAtterencoding ("utf-8"); réponse.getwriter (). println ("Veuillez télécharger le fichier dans Post"); } @SuppressWarnings ("Unchecked") public void doPost (HttpServLetRequest Request, httpservletResponse Response) lance ServletException, ioException {file file1 = null, file2 = null; String Description1 = null, Description2 = null; Response.SetcharAtterencoding ("UTF-8"); réponse.setContentType ("Text / HTML"); Printwriter out = réponse.getWriter (); out.println ("<! doctype html public /" - // w3c // dtd html 4.01 transitional // en / ">"); out.println ("<html>"); out.println ("<adread> <itle> un servlet </Title> </A-head>"); out.println ("<link rel = 'stylesheet' type = 'text / css' href = '.. / css / style.css'>"); out.println ("<porce>"); out.println ("<div align = centre> <br/>"); Out.println ("<FieldSet Style = 'Width: 90%'> <Legend> Téléchargez le fichier </gend> <br/>"); out.println ("<div class = 'line'>"); out.println ("<div align = 'Left' class = 'deftdiv'> télécharger le journal: </div>"); out.println ("<div align = 'Left' class = 'droitediv'>"); // Utilisez l'objet diskfileupload pour analyser la demande de diskfileupload diskfileupload = new diskfileupload (); Essayez {// Placez le résultat analysé dans List List <FichierItem> list = diskfileupload.parseRequest (request); out.println ("Trace via tous les fichiers ... <br/>"); // Trace via la liste de tous les fichiers dans le fichier filetem: list) {if (fileItem.isformField ()) {// si c'est un champ de texte if ("description1" .equals (fileItem.getFieldName ())) {// Si le nom de fichier est description1 out.println ("Travel to Description1 ... <br/>"); Description1 = new String (fileItem.getString (). GetBytes (), "UTF-8"); } if ("description2" .equals (fileItem.getFieldName ())) {// Si le fichier est le nom est description2 out.println ("Travel to Description2 ... <br/>"); Description2 = new String (fileItem.getString (). GetBytes (), "UTF-8"); }} else {// Sinon, pour le champ de fichier if ("file1" .equals (fileItem.getFieldName ())) {// Objet de fichier construit par le fichier client file reoteFile = new File (new String (fileItem.getName (). GetBytes (), "utf-8")); out.println ("Voyager vers File1 ... <br/>"); Out.println ("Emplacement du fichier client:" + RemoteFile.getAbsolutepath () + "<br/>"); // Fichier côté serveur, placez-le dans le dossier de téléchargement Fichier1 = nouveau fichier (this.getServletContext (). GetRealPath ("pièce jointe"), RemoteFile.getName ()); file1.getParentFile (). mKDirs (); file1.createenewfile (); // Écrivez un fichier et écrivez le contenu de fichier de FileItem dans le fichier inputStream ins = fileItem.getInputStream (); OutputStream OUS = new FileOutputStream (file1); essayez {byte [] buffer = new byte [1024]; int len = 0; while ((len = ins.read (tampon))> -1) OUS.Write (tampon, 0, len); out.println ("enregistrer le fichier" + file1.getabsolutepath () + "<br/>"); } Enfin {OUS.Close (); ins.close (); }} if ("file2" .equals (fileItem.getFieldName ())) {// Objet de fichier construit par le fichier client file reoteFile = new File (new String (fileItem.getName (). GetBytes (), "utf-8")); out.println ("Voyager vers File2 ... <br/>"); Out.println ("Emplacement du fichier client:" + RemoteFile.getAbsolutepath () + "<br/>"); // Fichier côté serveur, placez dans le dossier de téléchargement File2 = nouveau fichier (this.getServletContext (). GetRealPath ("pièce jointe"), RemoteFile.getName ()); file2.getParentfile (). mKDirs (); file2.CreateEwFile (); // Écrivez un fichier et écrivez le contenu du fichier de FileItem dans le fichier inputStream ins = fileItem.getInputStream (); OutputStream ous = new FileOutputStream (file2); essayez {byte [] buffer = new byte [1024]; int len = 0; while ((len = ins.read (tampon))> -1) OUS.Write (tampon, 0, len); out.println ("enregistrer un fichier" + file2.getabsolutepath () + "<br/>"); } Enfin {OUS.Close (); ins.close (); }}}} out.println ("L'analyse de demande est terminée"); } catch (fileUpLoAdException e) {// TODO Generated Catch Block E.PrintStackTrace (); } out.println ("</div>"); out.println ("<div align = 'Left' class = 'deftdiv'> file1: </div>"); out.println ("<div align = 'Left' class = 'droitediv'>"); out.println ("<a href = '" + request.getContextPath () + "/ attachement /" + file1.getName () + "' cible = _blank>" + file1.getName () + "</a>"); out.println ("</div>"); out.println ("</div>"); } if (file2! = null) {out.println ("<div class = 'line'>"); out.println ("<div align = 'Left' class = 'deftdiv'> file2: </div>"); out.println ("<div align = 'Left' class = 'droitediv'>"); out.println ("<a href = '" + request.getContextPath () + "/ attachment /" + urlencoder.encode (file2.getName (), "utf-8") + "' 'cible = _blank>" + file2.getName () + "</a>"); out.println ("</div>"); out.println ("</div>"); } out.println ("<div class = 'line'>"); out.println ("<div align = 'Left' class = 'deftdiv'> Description1: </div>"); out.println ("<div align = 'Left' class = 'droitediv'>"); out.println ("<div align = 'Left' class = 'droitediv'>"); out.println ("<div align = 'Left' class = 'deftdiv'> Description2: </div>"); out.println ("<div align = 'Left' class = 'droitediv'>"); out.println (Description2); out.println ("</div>"); out.println ("</div>"); out.println ("</ fieldset> </div>"); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); }}L'effet de fonctionnement du programme est illustré sur la figure:
Cet article a été compilé dans "Résumé des techniques d'opération de téléchargement Java", et tout le monde est le bienvenu pour apprendre et lire.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.