Le téléchargement et le téléchargement de fichiers sont des problèmes courants rencontrés dans le développement Web. Au cours des derniers jours, le téléchargement de fichiers a été utilisé dans un projet. J'ai également pris quelques notes de manière dispersée auparavant. Aujourd'hui, je vais l'organiser. Le téléchargement de fichiers nécessite des tests supplémentaires, parlons d'abord du téléchargement de fichiers.
1. Processus de traitement de téléchargement de fichiers
Le processus de téléchargement des fichiers est en fait très clair, c'est-à-dire:
1. Localisez les fichiers en fonction du nom de fichier ou du chemin du fichier. La stratégie spécifique est principalement basée sur vos propres besoins. En bref, le chemin complet des fichiers que le système peut trouver est requis.
2. Obtenez le flux d'entrée et obtenez le flux d'entrée du fichier cible.
3. Obtenez le flux de sortie et obtenez le flux de sortie de la réponse.
4. Lisez le fichier à partir du flux d'entrée et sortez le fichier via le flux de sortie. Ceci est le processus d'exécution de téléchargement réel.
5. Éteignez le flux IO.
Il s'agit du processus principal, et il existe certains paramètres d'attribut nécessaire, tels que le type de type contenu le plus important du fichier de paramètre, etc.
2. Ne parlez plus, ajoutez le code
Je l'ai fait avec SpringMVC, mais en fait, il en va de même pour d'autres choses. J'ai principalement besoin d'objet HTTPServletResponse et un fichier cible valide.
1. Code de réception
/ ** Télécharger le fichier téléchargé * / fonction téléchargement de FromupLoad (nom de fichier) {window.location.href = path + "/ download? Dir = upload & filename =" + encodeuri (encodeuri (filename));} / ** téléchargement normal * / fonction téléchargement (filename) {window.Location.href = path + "/ télécharger? dir = download & filename =" + encodeuri (encodeuri (nom de fichier));}2. Code de contrôleur
/ *** Téléchargement de fichiers (Télécharger à partir du chemin de téléchargement) * * @param demande * @param réponse * @throws ioException * / @ réponse @ requestmapping (value = "/ download") public void downloadfile (httpsservletRequest request, httpServletResponse réponse, filemodel modèle) lance {string filename = uldeccoder.deCode (model.getFille (), nom de filen = uldecode. "UTF-8"); / ** restreindre uniquement les fichiers dans les dossiers de téléchargement et de téléchargement peuvent être téléchargés * / string foldername = "download"; if (! StringUtils.isempty (model.getdir ()) && model.getdir (). request.getSession (). getServletContext (). getRealPath ("/") + "/ web-inf /" + foldername + "/" + filename; filetools.downloadfile (request, réponse, filebSolupath); log.warn ("userId:" + (integer) (request.getSession). (request.getSession (). getAttribute ("nom d'utilisateur")) + ", fichier téléchargé:" + filebSolutepath);}La logique de téléchargement ici est que la réception n'a besoin que de demander / télécharger et de donner les paramètres du nom du fichier. Afin d'éviter le code brouillé chinois, lorsque le nom de fichier de premier plan est utilisé comme paramètre, il utilise JS 'Encodeuri () pour le transformer en code Unicode, puis le décode en chinois. De plus, en raison de la nature particulière du projet, les fichiers que je souhaite télécharger ici peuvent être dans les dossiers de téléchargement et de téléchargement, donc il y a une partie de la logique de jugement ici. De plus, je résume à la fois le nom du fichier et le nom du dossier demandé dans FileModel.
3. Télécharger l'implémentation de la logique.
Il n'y a pas de service ici, mais il est directement implémenté à l'aide de méthodes statiques.
/ *** Spécifiez le nom de téléchargement lors du téléchargement du fichier * * @param demande * httpServletRequest * @param réponse * httpservletResponse * @param filepath * Path complet du fichier * @param nom de fichier * spécifie le nom de fichier affiché lorsque le client télécharge String FilePath, String FileName) lève IOException {BufferedInputStream Bis = NULL; BufferedOutputStream Bos = NULL; BIS = new BufferedInputStream (new FileInputStream (FilePath); Bos = new File (filepath) .length (); réponse.SetcharAtterencoding ("utf-8"); réponse.setContentType ("multipart / form-data"); / ** résoudre le problème chinois brouillé de chaque navigateur * / string userRagent = request.GetHeader ("user-agent"); byte [] bytes = userRangent.Contains ("MSIE"); Byte [] bytes = userRangent.Contains ("MSIE"); filename.getBytes (): filename.getBytes ("utf-8"); // filename.getBytes ("UTF-8") gère les problèmes de code brouillés dans safari filename = new String (octets, "iso-8859-1"); // Tous les navigateurs prennent essentiellement à prendre en charge l'ISO Encoding Response.sethEader ("Content-Disposition", String.format ("attachement; filename = /"% s / "", nom de fichier); Response.sethEader ("Content-Length", String.Valueof (FileLength)); Byte [] buff = New Byte [2048]; int byTesRead; bis.read (buff, 0, buff.length)))) {bos.write (buff, 0, bytesRead);} bis.close (); bos.close ();} / *** Le nom de fichier de téléchargement n'est pas spécifié lors du téléchargement du fichier * * @param demande * httpservletRelest * @param réponse * httpServletReSponse * @Param FirePath * Full de la réponse * @throws ioException * / public static void downloadfile (httpsservletRequest request, httpservletResponse réponse, string filepath) lance ioException {file file = new file (filepath); downloadfile (request, réponse, filepath, file.getname ());};Voici une méthode de téléchargement surchargée pour résoudre la nécessité de spécifier parfois le nom de fichier téléchargé par le client.
3. Choses à noter
1. À propos du choix du type mime
Je ne savais pas grand-chose sur les types de mime auparavant, mais j'ai constaté qu'il existe de nombreux codes source téléchargés sur Internet qui ont des paramètres différents. C'est cette phrase
réponse.setContentType ("multipart / form-data");J'ai vérifié que l'une des fonctions de définition du type MIME ici est de dire au navigateur client de traiter le fichier à télécharger dans quel format. Il existe de nombreuses explications sur le site Web correspondant spécifique. Si ce type de classe I est défini dans ce format, le format sera généralement apparié automatiquement.
2. Spécifiez le nom du fichier de téléchargement client
Parfois, nous pouvons avoir besoin de spécifier le nom du fichier lorsque le client télécharge le fichier, c'est-à-dire ce code
Response.sethEader ("Content-Disposition", String.Format ("Pixe; FileName = /"% S / "", FileName));
Le nom de fichier peut être personnalisé. La partie avant ne doit pas être déplacée.
3. Résoudre le problème des chinois brouillés
Il est trop courant que les fichiers chinois soient brouillés. Lorsque l'architecture du système de projet est construite pour la première fois, tous les encodages chinois doivent être unifiés, y compris dans l'éditeur, la page et la base de données. Le codage UTF-8 est recommandé. Si vous utilisez Spring, vous pouvez également configurer le filtre de jeu de caractères de Spring pour éviter davantage le code brouillé chinois.
(1) Le nom du fichier du processus de demande de téléchargement du client est brouillé
Parfois, nous le rencontrons. Lorsque la page de réception affiche la liste de téléchargement du nom de fichier chinois, elle est normale, mais lorsque nous passons à l'arrière-plan, nous constatons que le nom de fichier de la demande est brouillé. À l'heure actuelle, nous pouvons utiliser l'encodéuri mentionné ci-dessus pour résoudre le problème.
(2) Nom de fichier brouillé lorsque le client télécharge et exécute
Dans les tests réels, il a été constaté que lorsque d'autres navigateurs peuvent s'exécuter, le nom de fichier chinois sous IE peut sembler brouillé. J'ai vu un tel morceau de code en ligne. Après les tests, il a parfaitement résolu le problème du chinois a brouillé différents navigateurs.
/ ** Résoudre le problème chinois brouillé de chaque navigateur * / String userAgent = request.GetHeader ("user-agent"); byte [] bytes = userAgent.contains ("msie")? filename.getBytes (): filename.getBytes ("utf-8"); // filename.getBytes ("UTF-8") gère le problème brouillé de safari filename = new String (octets, "iso-8859-1"); // Tous les navigateurs prennent essentiellement une prise en charge ISO Encoding Response.sethEader ("Content-Disposition", String.Format ("Pixe; FileName = /"% S / "", FileName));(3) Fichier brouillé sur le serveur
Différents serveurs peuvent également être différents en fonction de la plate-forme, vous devez donc y faire attention ici. Pour des solutions spécifiques, veuillez vous référer à un article que j'ai écrit auparavant: Traitement brouillé chinois lors du téléchargement de fichiers.
Ce qui précède est le téléchargement du fichier d'implémentation Web Java et la méthode de traitement brouillé vous présenté par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!