Le téléchargement et le téléchargement de fichiers sont très courants pendant le développement. Voici un bref résumé:
1. Conditions qui doivent être remplies pour le téléchargement de fichiers:
un. La méthode du formulaire de page doit être publiée car les données transmises par GET sont trop petites
né Le formulaire ENCTYPE du formulaire de page doit être de type multiparte / format de forme
c. Le formulaire fournit des détails sur le téléchargement du champ de champ de saisie: dans le formulaire client: <formulaire ENCTYPE = "Multipart / Form-data" />
(Si cette propriété n'est pas disponible, le chemin de fichier lu par le serveur variera en fonction du navigateur)
Server ServleTinputStream est = request.getInputStream (); Obtient le contenu du corps de la demande dans un flux pour une analyse plus approfondie.
2. Détails du téléchargement de fichiers:
(1) Pourquoi définir le type de formulaire sur: Multipart / Form-Data. Il s'agit de définir la valeur réalisée par ce formulaire qui n'est pas la valeur clé =. Ce qui est passé est Bytecode.
La correspondance entre le formulaire et la demande:
Comme indiqué ci-dessus, vous pouvez voir qu'après avoir réglé le type de formulaire sur: Multipart / Form-Data, le fichier que vous avez sélectionné est initialisé en binaire dans le corps de la demande HTTP, comme indiqué dans l'image ci-dessus sous une chaîne aléatoire sous le cookie.
Mais notez qu'il existe deux lignes spéciales de caractères dans le fichier bytecode divisé par le fichier d'identification (c'est-à-dire une chaîne de chaînes aléatoires), à savoir la première ligne d'en-tête de fichier de contenu et une ligne de lignes vides. La troisième ligne après est le contenu du fichier binaire.
Par conséquent, lorsque le serveur accepte les fichiers téléchargés par le client, lors de l'obtention du binaire de fichiers dans les paramètres de demande HTTP, les trois premières lignes doivent être supprimées.
3. Analyser manuellement le fichier txt téléchargé:
Importer java.io.bufferedReader; Importer java.io.ioException; import java.io.inputStream; import java.io.inputstreamreader; import java.io.printwriter; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; / ** * Si le type de formulaire est publié et que l'EnCType est multipart / formulaire *, alors toutes les données sont transmises au serveur en mode binaire. * Donc req.getParamètre ("xxx") est toujours nul. * Vous ne pouvez obtenir des données que via req.getInputStream () et obtenir les données du texte * * @Author Wangxi * * / classe publique UpServlet étend Httpservlet {public void dopost (httpservletRequest req, httpservletResponse respleann String txt = req.getParameter ("txt"); // le retour est null System.err.println ("txt est:" + txt); System.err.println ("======================================"); InputStream dans = req.getInputStream (); // byte [] b = new octet [1024]; // int len = 0; // while ((len = in.read (b))! = - 1) {// String s = new String (b, 0, len); // system.err.print (s); //} tampon InputStreamReader (IN)); String Firstline = Br.Readline (); // Lisez la première ligne, et la première ligne est un symbole délimité, c'est-à-dire une chaîne de chaîne aléatoire fileName = Br.Readline (); // la deuxième ligne d'informations de fichier, et intercepter le nom de fichier depuis filename = filename.substring (filename.lastIndexof ("//") + 1); // xxx.txt "filename = FileName.SubString (0, FileName.Length () - 1); Br.Readline (); while (data = br.readline ())! = null) {if (data.equals (firstline + "-") {break;} out.println (data);} out.close (); 4. Utilisez Apache-FileUpload pour traiter les téléchargements de fichiers:
Framework: fait référence à l'encapsulation de l'entreprise que les utilisateurs traitent souvent dans un code. Faciliter l'appel des utilisateurs.
Le composant (cadre) qui télécharge actuellement le fichier:
Apache `` fileupload-
Orialiy cos 2008 () -
JSP-Smart-upload 200m.
Téléchargez le fichier à l'aide de Fileupload:
Nécessite l'importation de packages tiers:
Le fichier apache-fileupload.jar télécharge le package central.
Apache-comons-io.jar Ce package est un package de dépendance pour Fileupload. C'est aussi une boîte à outils.
Catégorie de base:
DiskFileItemFactory définit l'espace disque et enregistre des fichiers temporaires. Juste une classe.
ServletFileUpload - La classe de base pour les téléchargements de fichiers, qui reçoit des demandes et des paries.
ServletFileUpload.PaSeRequest (RequDest) - Liste <FichierItem>
Remarque: Un FileItem est le début d'un logo: -------- 243243242342 à -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Étape 1: Importez le package:
Étape 2: Écrivez un servlet pour compléter la méthode DoPost
/ ** * Deux paramètres construits par diskfileItemfactory * Le premier paramètre: SizethReadHold - définit le nombre d'octets de données à enregistrer dans le cache (mémoire), la valeur par défaut est 10k * Si un fichier n'est pas supérieur à 10k, vous pouvez simplement utiliser la mémoire pour l'enregistrer directement dans un fichier. * Si un fichier est supérieur à 10k, vous devez d'abord enregistrer le fichier dans un répertoire temporaire. * Le deuxième fichier de paramètres fait référence à l'emplacement du répertoire temporaire * * / classe publique UP2Servlet étend HttpServlet {public void doPost (httpServletRequest req, httpservletResponse resp) lance Servlexception, ioException {req.SetcharacteRencoding ("utf-8"); // Obtenez le chemin du chemin du projet Path de chaîne = getServletContext (). GetRealPath ("/ up"); // La première étape déclare la classe d'usine DiskFileItemfactory, qui est utilisée pour définir un répertoire temporaire sur le disque, diskfileItemFactory Disk = new DiskFileItemFactory (1024 * 10, nouveau fichier ("/ home / wang /")); // la deuxième étape: déclarer servletFileUpoload et recevoir le répertoire temporaire ci-dessus servletFileUpload up = new ServletFileUpload (disque); // La troisième étape: Parse Request Try {list <FeleItem> list = up.parserequest (req); // si un seul fichier fileItem file = list.get (0); // Obtenez le nom de fichier avec Path String FileName = file.getName (); filename = filename.substring (filename.LastIndexof ("//") + 1); // obtient le type de fichier string fileType = file.getContentType (); // Obtenez le bytecode du fichier inputStream dans = file.getInputStream (); // Déclarez le STOWN STREAT OUTPUTSTREAM OUT = NOUVEAU FileOutputStream (Path + "/" + FileName); // Byte de copie de fichiers [] b = nouveau octet [1024]; int len = 0; while ((len = in.read (b))! = - 1) {out.write (b, 0, len); } out.close (); long size = file.getInputStream (). Disponible (); // Supprimer le fichier temporaire téléchargé File.Delete (); // Affiche les données resp.setContentType ("Text / Html; charSet = UTF-8"); Printwriter op = resp.getwriter (); OP.print ("Fichier téléchargé avec succès <br/> Nom de fichier:" + nom de fichier); op.print ("<br/> Type de fichier:" + FileType); op.print ("<br/> taille de fichier (octets)" + taille); } catch (exception e) {e.printStackTrace (); }}}5. Utilisez ce framework pour télécharger plusieurs fichiers:
Étape 1: Modifiez le formulaire de la page sur plusieurs types d'entrée = "fichier"
<form action = "<c: url value = '/ up3Servlet' //>" method = "post" EncType = "multipart / form-data"> file1: <input type = "file" name = "txt"> <br/> file2: <input type = "file" name = "txt"> <br/> <entrée type = "soumission" /> </ Form>
Étape 2: Liste des traversées
La classe publique UP3Servlet étend HttpServlet {public void doPost (httpServLetRequest request, httpservletResponse réponse) lève ServletException, ioException {request.SetcharAtterencoding ("utf-8"); String path = getServletContext (). GetRealPath ("/ up"); // Déclarer le disque de disque Disque Disquefactory = nouveau diskfileItemfactory (); Disk.SetSizetHreshold (1024 * 1024); disk.setRepository (nouveau fichier ("d: / a")); // Déclarer le servlet qui analyse la demande servletFileUpload up = new ServletFileUpload (disque); Essayez {// Resolve Request List <FequeItem> list = up.parsErequest (request); // Déclare une liste <map> encapsuler les données de la liste de fichiers téléchargée <map <string, string >> ups = new ArrayList <map <string, string >> (); pour (fichier fileItem: list) {map <string, string> mm = new hashmap <string, string> (); // obtient le nom de fichier String filename = file.getName (); filename = filename.substring (filename.LastIndexof ("//") + 1); String fileType = file.getContentType (); InputStream dans = file.getInputStream (); int size = in.Available (); // Utilisez la classe d'outils fileUtils.copyInputStreamtoFile (dans, nouveau fichier (path + "/" + nom de fichier)); mm.put ("nom de fichier", nom de fichier); MM.PUT ("FileType", FileType); mm.put ("size", "+ size); ups.add (mm); file.delete ();} request.setAttribute (" UPS ", ups); // request.get.getRequestDispatcher (" / jsps / show.jsp ").Ce qui précède est la méthode courante de téléchargement de fichiers. Jetons maintenant un coup d'œil aux autres API de recherche de Fileupload.
Déterminez si un fichierItem est un objet fichier (type = fichier) ou un objet texte (Type = Text | Checkbox | Radio):
booléen isformfield () Si c'est du texte | cochez | Radio | Sélectionner, la valeur est vraie.
6. Processus des images avec des informations de description
classe publique UpmeScServlet étend HttpServlet {public void doPost (httpservletRequest request, httpservletResponse) lève ServletException, ioException {request.SetcharActeRending ("utf-8"); // vous pouvez obtenir le nom de fichier chinois Path = getSerContext (). GetRealpath ("/ up"); DiskfileItemfactory disk = new DiskFileItemFactory (); disk.setRepository (nouveau fichier ("d: / a")); essayez {servletFileUpload up = new ServletFileUpload (disque); List <FichierItem> list = up.parsErequest (request); pour (fichier fileItem: list) {// étape 1: déterminez s'il s'agit d'un élément de formulaire ordinaire if (file.isformfield ()) {String filename = file.getFieldName (); // <input type = "text" name = "desc"> = desc string value = file.getString ("utf-8"); // par défaut, lecture dans ISO, System.err.printLn (fileName + "); } else {// indique qu'il s'agit d'une chaîne de fichiers filename = file.getName (); filename = filename.substring (filename.LastIndexof ("//") + 1); file.write (nouveau fichier (path + "/" + nom de fichier)); System.err.println ("Le nom de fichier est:" + nom de fichier); System.err.println ("La taille du fichier est:" + file.getSize ()); file.delete (); }}} catch (exception e) {e.printStackTrace (); }}} 7. Amélioration des performances du téléchargement de fichiers
Lors de l'analyse de la demande d'obtention de la collection FileItem, utilisez:
FileItemiterator it = up.getItemiterator (request);
Par rapport à l'utilisation
List <FichierItem> list = up.parsErequest (request);
Des performances bien meilleures.
Exemple de code:
La classe publique FastServlet étend httpServlet {public void doPost (httpServLetRequest request, httpservletResponse réponse) lève ServletException, ioException {request.SetcharacteRending ("utf-8"); String path = getServletContext (). GetRealPath ("/ up"); DiskfileItemfactory disk = new DiskFileItemFactory (); disk.setRepository (nouveau fichier ("d: / a")); essayez {servletFileUpload up = new ServletFileUpload (disque); // Ce qui suit est le Mode Iterator FileItemiterator it = up.getIteMiterator (demande); while (it.hasnext ()) {fileItemStream item = it.next (); String filename = item.getName (); filename = filename.substring (filename.LastIndexof ("//") + 1); InputStream dans = item.openStream (); FileUtils.copyInputStreamtoFile (dans, nouveau fichier (path + "/" + nom de fichier)); }} catch (exception e) {e.printStackTrace (); }}} 8. Télécharger le fichier
Il peut être soit obtenir ou publier.
public void doPost (httpservletRequest req, httpservletResponse resp) lève ServletException, ioException {req.SetcharAtterencoding ("utf-8"); String name = req.getParameter ("name"); // Étape 1: Définissez le type de réponse resp.setContentType ("Application / Force-Download"); // la deuxième chaîne de fichiers de lecture Path = getServletContext (). GetRealPath ("/ up /" + name); InputStream dans = new FileInputStream (Path); // Définissez l'en-tête de réponse // Encodage d'URL User du nom de fichier nom = urlencoder.encode (nom, "utf-8"); resp.sethEader ("contenu-disposition", "attachement; filename =" + name); resp.setContentLength (in.Available ()); // Étape 3: Démarrez la copie de fichier OutputStream out = resp.getOutputStream (); octet [] b = nouveau octet [1024]; int len = 0; while ((len = in.read (b))! = - 1) {out.write (b, 0, len); } out.close (); joindre(); } Lorsque vous utilisez le cadre populaire J2EEIl est plus facile d'utiliser l'encapsulation interne du framework pour terminer le téléchargement et le téléchargement:
Struts2 est téléchargé.
Lorsque vous utilisez Struts2 pour le développement, il n'est pas difficile de constater que le package Commons-FileUpload-1.3.1.jar est présent dans le package JAR importé. Grâce à l'apprentissage ci-dessus, nous pouvons déjà l'utiliser pour télécharger et télécharger des fichiers. Mais Struts2 subit une encapsulation supplémentaire.
voir
<form action = "fileupload.action" metheth = "post" encType = "multipart / form-data"> nom d'utilisateur: <input type = "text" name = "username"> <br> file: <input type = "file" name = "file"> <br> <input type = "soumed" value = "soumi"> </ form>
Contrôleur
classe publique FileUploadAction étend ActionSUpport {Private String Username; // Notez que le fichier ne fait pas référence au fichier lui-même téléchargé par le JSP frontal, mais le fichier téléchargé pour stocker le fichier de fichier privé de fichier dans le dossier temporaire; // Le nom du fichier soumis // Struts interceptera automatiquement le nom du dernier fichier et l'injectera dans cette propriété Private String FileFileName; // Getter et Setter sont enregistrés à l'heure actuelle pour enregistrer l'espace @Override public String EXECUTE () lance l'exception {// Enregistrer le chemin d'accès à la chaîne de fichiers téléchargée root = servletActionContext.getServletContext (). GetRealPath ("/ upload"); // Obtenir un flux de fichiers temporaire InputStream est = new FileInputStream (fichier); // File de sortie outputStream OS = new FileOutputStream (nouveau fichier (root, fileFileName)); // Imprimez le nom de fichier du fichier téléchargé System.out.println ("FileFileName:" + FileFileName); // Parce que le fichier est un fichier stocké dans un dossier temporaire, nous pouvons imprimer son nom de fichier et son chemin de fichier pour voir s'il est le même que le fichier FileFileName System.out.println ("File:" + File.getName ()); System.out.println ("File:" + File.getPath ()); octet [] tampon = nouveau octet [1024]; int length = 0; while (-1! = (longueur = is.read (tampon, 0, buffer.length))) {os.write (tampon); } os.close (); is.close (); retourner le succès; }}Tout d'abord, nous devons être clairs que le fichier ici ne fait pas vraiment référence au fichier téléchargé par JSP. Lorsque le fichier est téléchargé, Struts2 recherchera d'abord l'emplacement de stockage spécifié par struts.multupart.savedir (c'est en défaut.properties) (par défaut est vide). Nous pouvons spécifier cet emplacement de stockage temporaire dans Struts2 de notre projet.
<constante name = "strut.multuparts.savedir" value = "/ référentiel" />
Si Struts.multuparpart.savedir n'est pas défini, l'adresse spécifiée par Javax.servlet.context.tempdir sera utilisée par défaut. La valeur de javax.servlet.context.tempdir est déterminée par le serveur. Par exemple: si le contexte de mon projet Web est ABC et que le serveur utilise Tomcat, alors SavePath doit être% Tomcat_Home% / Work / Catalina / LocalHost / ABC_. Le nom du fichier temporaire est similaire à upload__1a156008_1373a8615dd__8000_00000001.tmp. Le nom de fichier temporaire peut être différent à chaque fois, mais il est à peu près dans ce style. Et si vous utilisez des serveurs dans Eclipse pour configurer Tomcat et démarrer, le% tomcat_home% dans l'adresse ci-dessus ne sera pas le répertoire racine Tomcat réel dans le système, mais sera l'adresse spécifiée par Eclipse. Par exemple, mon adresse locale est la suivante: /home/wang/eclipsejavacode/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/catalina/localhost/abc/upload__1a156008_1373a8615dd__8000_00000001.tmp.
Struts2 est terminé le téléchargement.
Téléchargez plus simplement le fichier Struts2, définissez simplement un flux d'entrée et écrivez le fichier dans le flux d'entrée. La configuration de clé est toujours pour la configurer dans le fichier de configuration de strut.xml:
La classe publique FiledOwnloadAction étend ActionSUpport {// le chemin de temps pour télécharger le fichier sur le chemin de chaîne privé du serveur; // le nom du fichier du fichier à télécharger la chaîne privée téléchargement à téléchargement de filename; // Écrivez Getter et Setter Public InputStream GetdownloadFile () {return servletActionContext.getServletContext (). GetResourCeasStream (path); } @Override public String execute () lève exception {// L'action actuelle est la mise en œuvre de Téle-logiciels (xxx); retourner le succès; }}L'action définit simplement un flux de flux d'entrée puis lui fournit une méthode Getter. Ensuite, jetons un coup d'œil au fichier de configuration de strut.xml:
<action name = "filedownload"> <result name = "download" type = "stream"> <param name = "contenudisposition"> pièce jointe; filename = "$ {downloadFileName}" </ param> <param name = "inputName"> téléchargement </ param> </ result> </ action>Il y a plusieurs endroits où nous devons faire attention au fichier de configuration Strut.xml. Tout d'abord, le type doit être défini comme Stream Type_, disant à l'action Ceci est le résultat du téléchargement de fichiers. L'élément de résultat a généralement un sous-élément param. Ceci est utilisé pour définir les paramètres lors du téléchargement du fichier. L'attribut InputName consiste à obtenir le flux d'entrée de fichier dans l'action. Le nom doit être le même que l'attribut de flux d'entrée dans l'action. Ensuite, l'attribut ContentDisposition. Cet attribut est généralement utilisé pour spécifier comment nous souhaitons traiter le fichier téléchargé. Si la valeur est la pièce jointe, une boîte de téléchargement apparaîtra, permettant à l'utilisateur de choisir s'il faut télécharger. Si cette valeur n'est pas définie, le navigateur vérifiera d'abord d'ouvrir le fichier téléchargé. Si cela le peut, il ouvrira directement le fichier téléchargé (bien sûr, ce n'est pas ce dont nous avons besoin). Une autre valeur est le nom de fichier, qui est le nom de téléchargement du fichier invité par le fichier lors du téléchargement. Après avoir configuré ces informations, nous pouvons implémenter la fonction de téléchargement de fichiers.
Springmvc termine le téléchargement:
La vue est exactement la même que l'exemple Struts2. Ce n'est pas écrit.
Contrôleur:
@ Contrôleur @ requestmapping (value = "fileOperate") public class fileOperateAction {@RequestMapping (value = "upload") public String upload (httpservletRequest request, @ requestParam ("file") multipartFile PhotoFile) {// le chemin vers la mise en charge de la chaîne de file // La chaîne de nom de fichier d'origine filename = photofile.getoriginalFileName (); // obtient la chaîne d'extension de fichier ExtName = filename.substring (filename.lastIndexof (".")); // empêche les conflits de nom de fichier, modifiez légèrement le nom filename = filename.substring (0, filename.lastIndexof (".")) + System.NanoTime () + extname; FileUtils.writeBytearraytofile (nouveau fichier (dir, nom de fichier), photofile.getbytes ()); retourner le "succès"; }}Springmvc Téléchargement complet:
@RequestMapping ("/ Download") Public String Download (String File Name, HttpServLetRequest Request, HttpServletResponse Response) {Response.SetcharAtterencoding ("UTF-8"); réponse.setContentType ("multipart / form-data"); Response.SetHeader ("Content-Disposition", "Pixe; FileName =" + FileName); try {inputStream inputStream = new FileInputStream (nouveau fichier (chemin du fichier); outputStream os = réponse.getOutputStream (); byte [] b = new byte [2048]; int length; while ((longueur = inputStream.read (b))> 0) {os.write (b, 0, longueur);} // c'est bien fermé ici. } catch (filenotfoundException e) {e.printStackTrace ();} Catch (ioException e) {e.printStackTrace ();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.