Qu'est-ce que le téléchargement de fichiers?
Le téléchargement de fichiers est pour enregistrer les informations de l'utilisateur.
Pourquoi dois-je télécharger un fichier?
Lorsqu'un utilisateur s'inscrit, l'utilisateur peut avoir besoin de soumettre une photo. Ensuite, cette photo doit être enregistrée.
Téléchargez des composants (outils) Pourquoi devons-nous utiliser l'outil de téléchargement?
Pourquoi avons-nous besoin de télécharger des composants? Lorsque nous voulons obtenir les données du client, nous les obtenons généralement via la méthode getParameter ().
Les données de fichiers téléchargées sont divisées par le protocole MIME, et le formulaire est encapsulé en binaire. En d'autres termes: getParameter () ne peut pas obtenir les données du fichier téléchargé.
Voyons d'abord comment les téléchargements de fichiers HTTP apportent des données avec vous
Page JSP, le formulaire doit spécifier ENCTYPE: Multipart / Form Data
<form action = "$ {pagecontext.request.contextPath} / servlet / uploadServlet1" EncType = "multipart / form-data" Method = "Post"> user user: <input type = "text" name = "username"> <br/> upload file 1: <intrys type = "file" name = "file1"> <br/> upload file name = "file2"> <br/> <input type = "soumi" value = "soumi"> </ form>HTTP Package saisis
Essayez d'obtenir des données à l'aide de getParameter () sur Servlet
String ss = request.getParameter ("nom d'utilisateur"); System.out.println (ss);Vous ne pouvez pas obtenir les données en utilisant directement GetParameter.
Alors que devons-nous faire? ? ? ? L'objet de demande fournit le flux ServleTinputStream pour nous lire les données
Nous essayons de lire le fichier
ServleTinputStream inputStream = request.getInputStream (); octet [] octets = nouveau octet [1024]; int len = 0; while ((len = inputStream.read (bytes))> 0) {System.out.println (new String (bytes, 0, len)); }Ajouter un contrôle d'entrée supplémentaire à la page JSP
<input type = "text" name = "mot de passe">
Le fichier texte que j'ai téléchargé est 111111, et l'effet de lecture est le suivant:
Maintenant, nous pouvons lire les données du téléchargement de fichiers, mais maintenant la question est: comment séparer les données téléchargées du fichier des données envoyées au serveur? ? ? Nous avons vu ci-dessus sur la photo, ils sont mélangés.
Il est difficile de se séparer en fonction de notre pratique habituelle, nous devons donc télécharger des composants
Il existe deux types de composants de téléchargement de fichiers [plus d'opération] samrtupload [plus opération] Fileupload
Pour utiliser le composant FileUpload, vous devez importer deux packages de pot
Commons-io Commons-FileUpload Eartage ÉTAPES Créez un objet d'usine d'analyseur [diskfileItemfactory] Créez un analyseur via l'usine de l'analyseur [ServletFileupload] appelez la méthode analyseur pour analyser l'objet de demande, obtenir tous les contenus téléchargés [Liste] traversant la liste, déterminer si chaque objet est un fichier téléchargé. S'il s'agit d'un champ de formulaire normal, obtenez le nom et la valeur du champ du champ. S'il s'agit d'un fichier téléchargé, appelez la méthode InputSteam pour obtenir le flux d'entrée, lisez rapidement les données téléchargées.
essayez {// 1. Obtenez l'usine de l'analyseur DiskFileItemFactory Factory = new DiskFileItemFactory (); // 2. Obtenez le Parser ServletFileUpload upload = new ServletFileUpload (Factory); // 3. Déterminez le type de formulaire de téléchargement if (! Upload.ismulTipartContent (request)) {// télécharger le formulaire est un formulaire normal, puis obtenir les données de la manière traditionnelle pour retourner; } // Pour télécharger le formulaire, appelez l'analyseur pour analyser la liste de données téléchargée <FequeItem> list = upload.PaSeRequest (request); // fileItem // transfuse la liste et obtenez l'objet FileItem utilisé pour encapsuler le premier objet de téléchargement de données de téléchargement FileItem pour (FileItem Item: list) {if (item.isformField ()) {// Ce que vous obtenez est l'élément d'entrée normal Nom = item.getFieldName (); // Obtenez le nom de la valeur de chaîne d'élément d'entrée = item.getString (); System.out.println (nom + "=" + valeur); } else {// Obtenez la chaîne d'élément d'entrée de téléchargement fileName = item.getName (); // obtient le nom de fichier de téléchargement c: / documents et paramètres / thinkPad / Desktop / 1.txt filename = filename.substring (filename.lastIndexof ("//") + 1); InputStream dans = item.getInputStream (); // Obtenir des données de téléchargement int len = 0; tampon d'octet [] = nouveau octet [1024]; String SavePath = this.getServletContext (). GetRealPath ("/ upload"); FileOutputStream out = new FileOutputStream (SavePath + "//" + FileName); // Écrivez le fichier dans le répertoire de téléchargement while ((len = in.read (tampon))> 0) {out.write (buffer, 0, len); } in.close (); out.close (); }}} catch (exception e) {e.printStackTrace (); }Test que les champs ordinaires et les fichiers téléchargés peuvent être lus et obtenus!
Smartupload
Pour utiliser le composant SmartUpload, vous devez importer le package de développement SmartUpload.jar
Démarrage rapide
// Composant instancié smartUpload smartUpload = new smartUpload (); // Initialisez l'opération de téléchargement smartUpload.Initialize (this.getServletConfig (), demande, réponse); essayez {// télécharger la préparation smartUpload.upload (); // Pour les données ordinaires, il est si simple que l'objet de demande ne peut pas obtenir les paramètres soumis. En outre, vous devez compter sur SmartUpload String Password = SmartUpload.getRequest (). GetParameter ("Mot de passe"); System.out.println (mot de passe); // Téléchargez dans le dossier de téléchargement SmartUpload.Save ("uploadFile"); } catch (smartUpLoadexception e) {e.printStackTrace (); }test
De même, nous pouvons télécharger des fichiers dans le dossier uploadfile. La quantité de code est en effet beaucoup réduite!
Vous pouvez également obtenir des paramètres des champs normaux
J'ai changé le nom du fichier en code brouillé chinois et code brouillé chinois pour télécharger des données, et c'était du code brouillé:
Les données chinoises soumises par le formulaire sont également brouillées.
Comme mentionné ci-dessus, le formulaire de téléchargement des données de fichier est encapsulé en binaire, donc l'utilisation de la demande pour coder les données ne fonctionnera pas pour les données soumises par le formulaire!
Fileupload résout du code brouillé
L'utilisation de fichiers pour résoudre des problèmes brouillé est très simple
Résolvez le nom de fichier chinois brouillé. Après avoir obtenu l'analyseur, définissez simplement le codage de l'analyseur à UTF-8!
// Définissez le codage de Téléchargez FileUpload.SetheDerencoding ("UTF-8");Résolvez les données de la forme brouillé. Lorsque vous obtenez des valeurs de formulaire, utilisez un codage UTF-8 pour les obtenir.
String value = fileItem.getString ("utf-8");Effet:
SmartUpload résout le code brouillé
Ce composant est un peu gênant pour résoudre le problème du code brouillé. J'ai trouvé diverses solutions en ligne mais je n'en ai pas trouvé de simple ...
Par conséquent, si les données n'impliquent pas le chinois, utilisez le composant SmartUpload et s'il implique des données chinoises, utilisez le composant Fileupload!
Télécharger plusieurs fichiers, ajouter dynamiquement les contrôles de téléchargement
Supposons que j'ai plusieurs fichiers à télécharger maintenant et que le nombre de fichiers à télécharger est incertain. Alors que devons-nous faire? ? ?
Il nous est impossible de répertorier de nombreux contrôles pour télécharger des fichiers sur la page, ce qui n'est pas beau. Si l'utilisateur ne peut pas utiliser autant de contrôles, c'est un gaspillage.
Par conséquent, nous voulons ajouter dynamiquement des contrôles pour le téléchargement de fichiers. Si l'utilisateur souhaite également télécharger des fichiers, il n'a qu'à générer dynamiquement des contrôles!
analyser
Pour générer des contrôles dynamiquement sur la page, ce n'est rien de plus que d'utiliser le code JavaScript.
Alors, que faisons-nous? ?
Faisons ceci: lorsque l'utilisateur souhaite télécharger un fichier, cliquez sur le bouton et le bouton lie l'événement pour générer le contrôle pour le téléchargement de fichiers.
Afin de faire plus parfaitement, chaque fois qu'un contrôle de téléchargement de fichiers est généré, un bouton de suppression est également fourni pour supprimer le contrôle!
Nous devons utiliser Div pour charger les commandes et supprimer les boutons que nous voulons générer. Lorsque l'utilisateur clique pour supprimer, il doit masquer le bouton Supprimer et les contrôles de téléchargement de fichiers ensemble. Il est donc préférable d'utiliser des divs imbriqués!
Code de page de code:
<Bile> <Tr> <Td> User user: </td> <td> <input type = "text" name = "username"> </td> </tr> <tr> <td> Ajouter un fichier de téléchargement </td> <td> <entrée = "Button" value = "Ajouter un fichier de téléchargement"> </td> </tr> <Tr> <Td> </tr> </ table>
code javascript
<script type = "text / javascript"> function adduploadFile () {// generate File upload Control var input = Document.CreateElement ("input"); input.type = 'file'; input.name = 'filename'; // générer le bouton delete var del = document.CreateElement ("entrée"); del.type = 'bouton'; del.value = 'Delete'; // Générer Div interne var innerDiv = document.CreateElement ("div"); // lier deux contrôles à innerdiv.appendChild (entrée); innerdiv.appendChild (del); // Obtenez le contrôle externe de la div et liez le div interne à la div externe var outerDiv = document.getElementById ("fichier"); OutterDiv.ApendChild (Innerdiv); // Bind Event del.OnClick = fonction delete () {// appelant la méthode de suppression du div externe pour tuer le div interne this.parentNode.parentNode.removechild (this.parentNode); }} </ script>Détails de téléchargement de fichiers Si la taille du fichier téléchargé est supérieure à la taille du fichier que nous définissons, le fichier utilisera un fichier temporaire pour enregistrer les données téléchargées lors du téléchargement. Après le téléchargement, nous devons supprimer le fichier temporaire. L'emplacement où le fichier de téléchargement ne peut pas être géré par le serveur Web, sinon il peut entraîner des problèmes de sécurité [d'autres peuvent modifier le fichier de téléchargement via les moyens] Si le nom du fichier de téléchargement est le même, le fichier de téléchargement d'origine sera écrasé. Nous voulons générer un nom de fichier unique. Si le nombre d'utilisateurs est grand, il existe de nombreux fichiers téléchargés. Ensuite, nous ne devons pas enregistrer tous les fichiers de téléchargement dans un seul répertoire, ce qui est susceptible de provoquer le plantage du disque. Nous devons donc disperser les fichiers téléchargés dans différents répertoires. analyser
Le problème de la suppression des fichiers temporaires est très simple. Il vous suffit d'appeler la méthode delete () de FileItem qu'une fois toutes les opérations terminées.
Pour éviter que le fichier téléchargé soit géré par le serveur Web, nous pouvons simplement placer l'emplacement du fichier téléchargé dans le répertoire Web / répertoire!
Pour le même nom de fichier, nous pouvons utiliser le nom de fichier UUID + Téléchargé par l'utilisateur comme notre nom de fichier Téléchargé. Un tel nom de fichier est unique.
Pour briser les fichiers téléchargés, nous devons utiliser l'algorithme de code HashCode pour rompre.
Les quatre bits inférieurs génèrent un répertoire de premier niveau 5-8 bits génèrent un code de répertoire de deuxième niveau
Écrivons un code de fichier de téléchargement relativement complet
Utilisez l'algorithme de code HashCode pour briser les répertoires enregistrés
String privé MakedirPath (String FileName, String Path) {// Calculez les répertoires primaires et secondaires via le nom de fichier int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; int dir2 = (hashcode & 0xf0) >> 4; String dir = path + "//" + dir1 + "//" + dir2; // Si le répertoire n'existe pas, créez le fichier du répertoire = nouveau fichier (dir); if (! file.exists ()) {file.mkDirs (); } // retourne le retour de retour entier; }Générer des noms de fichiers uniques
String privé MakeFileName (String FileName) {// Utilisez un sous-ore pour séparer l'UUID et le nom du fichier, et le nom du fichier peut être analysé plus tard. return uuid.randomuuid (). toString () + "_" + nom de fichier; }Code téléchargé
// Créer une usine DiskFileItemFactory Factory = new DiskFileItemFactory (); // Créer un analyseur via l'usine servletFileUpload fileupload = new ServletFileUpload (Factory); // Définissez le code de téléchargement de fichiers upload.setheDerencoding ("UTF-8"); // Jugez le type de formulaire de téléchargement if (! Fileupload.ismulTipartContent (demande)) {// Téléchargez le formulaire comme formulaire normal, puis obtenez les données de la manière traditionnelle pour revenir; } essayez {// analyse l'objet de demande pour obtenir la liste [Chargez tous les contenus téléchargés] List <FequeItem> list = fileupload.parsErequest (request); // voyage via la liste pour déterminer si le contenu chargé est un champ normal ou un fichier de téléchargement pour (fileItem FileItem: list) {// s'il s'agit d'un élément d'entrée normal if (fileItem.isformField ()) {// Obtenez le nom et la valeur de l'élément d'entrée Nom = fileItem.getFieldName (); String value = fileItem.getString ("utf-8"); System.out.println (nom + "=" + valeur); } else {// S'il s'agit d'un fichier de téléchargement // Obtenez le nom de téléchargement [y compris le nom de chemin] String filename = fileItem.getName (); // intercepte le nom de fichier filename = filename.substring (filename.lastIndexof ("//") + 1); // générer un nom de fichier unique filename = makeFileName (nom de fichier); InputStream inputStream = fileItem.getInputStream (); // Obtenez le chemin du projet et écrivez le fichier téléchargé sur le project de chaîne Path = this.getServletContext (). GetRealPath ("/ web-inf / uploadfile"); // Obtenez la chaîne de chemin de répertoire dispersé realPath = makedirPath (nom de fichier, chemin); FileOutputStream outputStream = new FileOutputStream (realPath + "//" + filename); octet [] octets = nouveau octet [1024]; int len = 0; while ((len = inputStream.read (bytes))> 0) {outputStream.write (bytes, 0, len); } inputStream.close (); outputStream.close (); // supprime les données du fichier temporaire fileItem.delete (); }}} catch (fileUpLaDaDException e) {e.printStackTrace (); }Effet: Le répertoire a été interrompu avec succès et le nom du fichier était unique.
Énumérez les fichiers dans le répertoire téléchargé et fournissez des téléchargements
Lors de l'explication de l'objet de réponse, le téléchargement du fichier a été expliqué. Cette fois, nous rédigerons un petit cas pour consolider le téléchargement du fichier.
Il y a 3 fichiers dans le répertoire de téléchargement
analyser
Tout d'abord, répertoriez tous les fichiers du répertoire. Puisque nous devons télécharger le fichier en fonction du nom du fichier plus tard, nous utilisons une collection de cartes pour enregistrer tous les fichiers
La pièce de téléchargement est également très simple. Trouvez le fichier correspondant en fonction du nom du fichier et téléchargez l'emplacement du fichier, lisez-le et écrivez, puis modifiez l'en-tête du message pour obtenir le téléchargement.
Obtenez le chemin d'accès pour charger et télécharger des fichiers, trouver tous les fichiers par récursivement (à juger s'il s'agit d'un fichier ou d'une sortie récursive), de le charger dans la collection de cartes et de passer la collection de cartes à la réception pour afficher lorsque l'utilisateur clique pour télécharger, puis d'obtenir le chemin absolu en fonction du nom d'origine. Si la ressource existe, l'utilisateur est autorisé à télécharger le code et à mettre tous les fichiers stockés dans le répertoire Web-infr / dans la collection de cartes.
Protected void doPost (requette httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {// Obtenez le répertoire où le fichier téléchargé est string filepath = this.getServletContext (). getRealPath ("/ Web-inf / uploadfile"); Map map = new HashMap (); // Utilisez la récursivité pour obtenir tous les fichiers et les ajouter à la collection de cartes getAllFiles (nouveau fichier (filepath), map); request.setAttribute ("map", map); request.getRequestDispatcher ("/ listfile.jsp"). Forward (demande, réponse); } private void getAllFiles (fichier filepath, map map) {// Si ce n'est pas un fichier, alors c'est un dossier si (! filepath.isfile ()) {// Liste tous les fichiers dans le dossier (peut-être un fichier, peut-être un dossier) fichier [] files = relepath.listFiles (); pour (fichier de fichier: fichiers) {// juge le fichier obtenu (ou le dossier) et getAllFiles (fichier, map); }} else {// Entrez l'instruction ELSE, il doit s'agir d'un fichier // La chaîne de nom de fichier fileName = filepath.getName (). substring (filePath.getName (). LastIndexof ("_") + 1); // Nous enregistrons le nom complet du fichier comme la clé et le nom de fichier comme valeur dans la collection de cartes map.put (filepath.getName (), nom de fichier); }}Afficher les fichiers téléchargeables dans la page JSP
<c: foreach items = "$ {map}" var = "me"> <c: url var = "url" value = "/ downfileservlet"> <c: param name = "fileName" value = "$ {me.key}"> </c: param> </ c: url> $ {me.value} <a href = "$ {url}" redrewre </a> <br> </ c: foreach>Implémenter le servlet téléchargé
Protégé void DOPOST (requête HTTPServletRequest, réponse httpservletResponse) lève ServletException, ioException {// Obtenez le nom complet de la chaîne de fichiers fileName = request.getParameter ("FileName"); // S'il s'agit de données chinoises, un transcodage est requis. filename = new String (filename.getBytes ("ISO8859-1"), "UTF-8"); // Obtenez l'emplacement où le fichier est enregistré Path de chaîne = this.getServletContext (). GetRealPath ("/ web-inf / uploadfile"); // Le fichier est enregistré via le nom de fichier par HashCode, et le fichier est obtenu via la chaîne de nom de fichier filealPath = MakeFilePath (nom de fichier, chemin); System.out.println (FileRealPath); // juger si le fichier existe un fichier Fichier = nouveau fichier (filealPath); if (! file.exists ()) {request.setAttribute ("Message", "La ressource que vous souhaitez télécharger n'existe pas!"); request.getRequestDispatcher ("/ message.jsp"). Forward (demande, réponse); retour ; } // existe // Lisez le fichier et écrivez les données dans le navigateur FileInputStream inputStream = new FileInputStream (FileleRealPath); octet [] octets = nouveau octet [1024]; int len = 0; while ((Len = inputStream.read (bytes))> 0) {réponse.getOutputStream (). write (bytes, 0, len); } inputStream.close (); // Définissez l'en-tête de message pour indiquer au navigateur qu'il s'agit de la chaîne de fichiers téléchargée nom = filename.substring (filename.LasTindexof ("_") + 1); Response.sethEader ("Content-Disposition", "attachement; filename =" + urlencoder.encode (nom, "utf-8")); } private String MakeFilePath (String FileName, String Path) {int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; int dir2 = (hashcode & 0xf0) >> 4; String dir = path + "//" + dir1 + "//" + dir2 + "//" + nom de fichier; retour dir; }Effet
S'il y a une erreur dans l'article, veuillez me corriger et tout le monde communiquera entre eux. Merci pour votre soutien à wulin.com.