Présentation de téléchargement de fichiers
Pour réaliser la fonction de téléchargement de fichiers dans le développement Web, vous devez effectuer les deux étapes suivantes:
Ajouter le téléchargement des entrées sur la page Web
Lisez les données de fichiers téléchargées dans le servlet et enregistrez-les sur le disque dur local.
Comment ajouter Télécharger des éléments d'entrée sur les pages Web?
La balise <entrée type = "fichier"> est utilisée pour ajouter des éléments d'entrée de téléchargement de fichiers sur la page Web. Vous devez prêter attention lors de la définition des éléments d'entrée de téléchargement de fichiers:
1. L'attribut de nom de l'élément d'entrée d'entrée doit être défini, sinon le navigateur n'enverra pas les données de fichier téléchargées.
2. La valeur ENCTYPE de la forme doit être définie sur les données multipart / format. Après avoir défini cette valeur, lorsque le navigateur télécharge le fichier, il attachera les données de fichier au corps du message de demande HTTP et utilise le protocole MIME pour décrire le fichier téléchargé pour faciliter le récepteur pour analyser et traiter les données téléchargées.
Présentation de téléchargement de fichiers
Comment lire les données de téléchargement de fichiers dans Servlet et les enregistrer sur un disque dur local?
L'objet de demande fournit une méthode GetInputStream, à travers laquelle les données soumises par le client peuvent être lues. Cependant, comme les utilisateurs peuvent télécharger plusieurs fichiers en même temps, il s'agit d'un travail très gênant pour lire par programme les données de téléchargement directement du côté servlet et analyser les données de fichier correspondantes séparément, exemples.
Pour faciliter les utilisateurs pour traiter les données de téléchargement de fichiers, l'organisation Open Source Apache fournit un composant open source (Commons-FileUpload) utilisé pour traiter les téléchargements de fichiers de formulaire. Ce composant a d'excellentes performances et son API est extrêmement simple à utiliser, permettant aux développeurs d'implémenter facilement les fonctions de téléchargement de fichiers Web. Par conséquent, la fonction de téléchargement de fichiers est généralement implémentée dans le développement Web, qui est généralement implémentée à l'aide du composant Commons-FileUpload.
Utilisez le composant Commons-FileUpload pour implémenter le téléchargement de fichiers, et vous devez importer les packages de pot de support correspondants pour ce composant: Commons-fileupload et commons-io. Commons-io n'appartient pas au fichier de pot de développement pour les composants de téléchargement de fichiers, mais le composant Commons-FileUpload commence par la version 1.1 et nécessite la prise en charge du package Commons-io lorsqu'il fonctionne.
Fichier de travail du composant Fileupload
API Core - DiskFileItemfactory
DiskFileItemFactory est l'usine qui crée des objets FileItem. Méthodes courantes pour cette classe d'usine:
public void setSizEthReshold (int sizethReshold): définit la taille du tampon de mémoire, la valeur par défaut est de 10k. Lorsque le fichier de téléchargement est supérieur à la taille du tampon, le composant Fileupload téléchargera le fichier à l'aide d'un cache de fichier temporaire.
public void setRepository (Java.io.File Repository): Spécifiez le répertoire de fichiers temporaire, la valeur par défaut est System.getProperty ("java.io.tmpdir").
public diskfileItemfactory (int sizethreshold, java.io.file référentiel): constructeur
API Core - ServletFileUpload
ServletFileUpload est responsable du traitement des données de fichiers téléchargées et résume chaque élément d'entrée dans le formulaire dans un objet FileItem. Les méthodes courantes sont:
Boolean IsmultiPartContent (demande HttpServleRequest): détermine si le formulaire téléchargé est le type de multipart / format de forme
Liste PARSEREQUEST (demande HttpServletRequest): analysez l'objet de demande, enveloppez chaque élément d'entrée dans le formulaire dans un objet FileItem et renvoyez une collection de liste qui enregistre tous les fichiers.
setFileSizEMAX (Long FileSizEMax): Définissez la valeur maximale des fichiers téléchargés
SetSizEMax (Long Sizemax): Définissez la valeur maximale du nombre total de fichiers téléchargés
SetheDerencoding (Java.lang.String Encoding): Définissez le format de codage
setProgressListener (ProgressListener Plistener)
Cas de téléchargement de fichiers
Étapes de mise en œuvre
1. Créez un objet DiskFileItemFactory, définissez la taille du tampon et le répertoire de fichiers temporaires 2. Utilisez l'objet DiskFileItemFactory pour créer un objet ServletFileUpload et définissez la limite de taille pour le téléchargement de fichiers.
3. Appelez ServletFileUpload.ParsErequest Méthode pour analyser l'objet de demande et obtenir un objet de liste qui enregistre tous les contenus téléchargés.
4. Itérer sur la liste. Chacun itère un objet FileItem et appelez sa méthode iSformField pour déterminer s'il s'agit d'un fichier téléchargé.
Il s'agit d'un champ de formulaire normal, puis appelez GetFieldName et GetString Méthodes pour obtenir le nom et la valeur du champ du champ
Pour télécharger un fichier, la méthode GetInputStream est appelée pour obtenir le flux d'entrée de données, lisant ainsi les données téléchargées.
Encodage pour implémenter le téléchargement de fichiers
Traitement des détails du téléchargement de fichiers
Problème brouillé de fichiers chinois
Le problème du nom de fichier chinois brouillé, vous pouvez appeler la méthode SetheDerencoding de Servletuploader, ou définir la propriété setChareCterencoding de la demande
Problème de suppression temporaire des fichiers
Étant donné que la taille du fichier dépasse la taille du tampon de mémoire défini par la méthode DiskFileItemFactory.SetSizethReshold, le composant Commons-FileUpload utilisera un fichier temporaire pour enregistrer les données téléchargées. Par conséquent, à la fin du programme, assurez-vous d'appeler la méthode FileItem.Delete pour supprimer le fichier temporaire.
L'appel à la méthode de suppression doit être après la fermeture du flux, sinon l'utilisation du fichier se produira, entraînant la défaillance de la suppression.
Emplacement du stockage de fichiers
Pour garantir la sécurité du serveur, les fichiers téléchargés doivent être enregistrés dans le répertoire Web de l'application ou dans un répertoire non géré par le serveur Web.
Pour empêcher plusieurs utilisateurs de télécharger des fichiers avec le même nom de fichier, ce qui entraîne un écrasement de fichiers, le téléchargeur de fichiers doit s'assurer que le fichier téléchargé a un nom de fichier unique.
Afin d'éviter trop de fichiers dans un seul répertoire et d'affecter la vitesse de lecture et d'écriture de fichiers, le programme qui gère les fichiers de téléchargement doit sélectionner l'algorithme de génération de structure du répertoire approprié en fonction de la quantité totale de téléchargements de fichiers possibles et stocker les fichiers téléchargés de manière dispersée.
Téléchargement de fichiers
Étant donné que le fichier à télécharger peut être de différents types, le fichier doit être transféré au client et son contenu correspondant doit être traité comme binaire, de sorte que la méthode doit être appelée pour renvoyer l'objet ServelTOutputStream pour écrire le contenu du fichier au client.
Télécharger le boîtier
Itérer via tous les fichiers du répertoire de téléchargement et les affiche à l'utilisateur et permet à l'utilisateur de terminer le téléchargement.
(Lisez tous les fichiers dans un certain dossier, enregistrez-les dans la liste de la collection, puis enregistrez-les dans la portée de la demande) ListFileservlt (Afficher la liste des fichiers) ListFiles.jsp ---- dowaaservlet.javaprivate ID de chaîne; private String savename; // le nom du fichier de téléchargement, le nom UUID du fichier private String realName; // le vrai nom du fichier de téléchargement privé String SavePath; // N'oubliez pas l'emplacement de la hausse de la date privée du fichier; // l'heure de téléchargement du fichier Private String Description; // la description du nom d'utilisateur de chaîne privée de fichiers; // le uploader listfileservletpackage com.hbsi.servlet; import java.io.file; import java.io.ioexception; import java.io.printwriter; import java.util.hashmap; import java.util.map; import javax.servlet.servlexect; import; javax.servlet.http.httpservlet; importjavax.servlet.http.httpservletRequest; importjavax.servlet.http.httpservletResponse; classe publique listfileservlet Response) ThrowsServletException, ioException {stringSavePath = this.getServletContext (). getRealPath ("/ web-inf / upload"); mapmap = new hashmap (); listFiles (newFile (SavePath),, map); request.setAttribute ("map", map); request.getRequestDispatcher ("/ listfile.jsp"). // UUID_A_1_3_3.TXTSTRINGREALNAME = UUIDNAME.SUBSTRING (UUIDNAME.Indexof ("_") + 1); Map.put (uUIdName, RealName);} else {file [] FileS = File.ListFiles (); For (fichiers F: Files) {listFiles (F, Map);}}} DOPOST (HttpServletRequest Request, HttpServletResponse Response) ThrowSServletException, ioException {Doget (request, réponse);}} téléchargementservletpackage com.hbsi.servlet; import java.io.file; importer java.io.fileInputStream; import java.io.ioexception; import java.io.outStream; import java.io.ioexception; import java. java.io.printwriter; Importer java.net.urlencoder; import javax.servlet.servletException; import javax.servlet.http.httpservlet; importjavax.servlet.http.httpservletRequest; public downloadservlet.http.httpServletReresser; ExtendShtTPServlet {publicVoid doGet (HttpServLetRequest Request, HttpServletResponse Response) ThrowSServletException, ioException {stringFileName = request.getParameter ("FileName"); filename = new String (filename.getBytes ("iso8859-"),, "UTF-8"); System.out.println (FileName); stringSavePath = this.getFilesAvePath (this.getRealName (fileName)); filef = new File (SavePath + "//" + FileName); if (! F.Exists ()) {request.SetAttribute ("Message", "La ressource téléchargée ne fait pas exister "); request.getRequestDispatcher (" / message.jsp "). octet [1024]; intlen = 0; outputStreamout = réponse.getOutputStream (); while ((len = in.read (buf))> 0) {out.write (buf, 0, len);} in.close ();} publicSstring getFilesAvepath (string filename) {intdir1 = filename.hashcode () & 0xf; Intdir1 = (filename.hashcode () >> 4) & 0xf; stringsAvepath = this.getServletContext (). getRealPath ("/ web-inf / upload") + "//" + Diir1 + "//" + dir2; returnsAvepath;} publicsstring getRealName (string filename) {stringRealname = filename.substring (filename.indexof ("_") + 1); returnRealName;} publicVoid doPost (httpsservletRequest request, httpservletResponse réponse) throwsservletException, ioException {doGet (request, réponse);}}