Il existe deux types de téléchargements de fichiers Web. La première est que le fichier est dans le répertoire du site Web. Vous pouvez le télécharger en entrant directement le chemin du fichier dans le navigateur, tel que http://www.xxx.com/file.zip. Un autre type est que le fichier n'est pas dans le répertoire du site Web ou que le fichier est généré dynamiquement (rapports d'exportation ou exportation Excel, etc.). Dans ce cas, le téléchargement du fichier doit être réalisé via le montant de sortie de la réponse. DownloadUtils est une classe d'outils de téléchargement de fichiers Web Java qui fournit une variété de méthodes statiques pour implémenter le téléchargement de fichiers.
Package com.rhui.util; Importer java.io.BufferedInputStream; Importer java.io.BufferedOutputStream; Importer java.io.file; import java.io.fileInputStream; Importer java.io.ioException; import java.io.inputStream; import java.io.outputStream; import java.net.urlencoder; import javax.servlet.http.httpservletResponse; import org.apache.commons.lang3.stringutils; / ** * Classe de téléchargement de fichiers * / classe publique DownloadUtils {/ ** * Encodage de téléchargement de fichiers * Cet encodage indique au navigateur la méthode d'encodage du nom de fichier pour empêcher le code brouillé lors du téléchargement des noms de fichiers chinois * / privé Static String Encoding = "UTF-8"; / ** * Téléchargement du fichier * @param réponse * @param filepath le chemin du fichier sur le serveur, y compris le nom de fichier * / public static void download (httpservletResponse réponse, string filepath) {file file = new file (filepath.toString ()); Télécharger (réponse, fichier, null, codage); } / ** * Téléchargement du fichier * @param réponse * @param filepath le chemin du fichier sur le serveur, y compris le nom de fichier * @param nom de fichier le nom du fichier téléchargé dans le navigateur. Si vous ne voulez pas le nom du fichier téléchargé par le navigateur au même nom de fichier sur le serveur, veuillez définir ce paramètre * / public static void download (httpservletResponse réponse, string filepath, string filename) {file file = nouveau file (filepath.tostring ()); Télécharger (réponse, fichier, nom de fichier, codage); } / ** * Téléchargement du fichier * @param réponse * @param filepath le chemin du fichier sur le serveur, y compris le nom de fichier * @param nom de fichier le nom du fichier téléchargé dans le navigateur. Si vous ne voulez pas que le nom de fichier soit téléchargé par le navigateur au nom du fichier sur le serveur, veuillez définir ce paramètre * @param codage de nom de fichier Encoding * / public static void download (httpServletResponse réponse, string filepath, string filename, String coding) {file file = new File (filepath.tostring ()); Télécharger (réponse, fichier, nom de fichier, codage); } / ** * Téléchargement du fichier * @param réponse * @param fichier de fichier * @param nom de fichier le nom du fichier téléchargé dans le navigateur. Si vous ne voulez pas que le nom de fichier soit téléchargé par le navigateur au nom du fichier sur le serveur, veuillez définir ce paramètre * / public static void download (httpservletResponse réponse, fichier de fichier) {téléchargement (réponse, fichier, null, encodage); } / ** * Téléchargement du fichier * @param réponse * @param fichier de fichier * @param nom de fichier le nom du fichier téléchargé dans le navigateur. Si vous ne voulez pas que le nom de fichier soit téléchargé par le navigateur au même nom du fichier sur le serveur, veuillez définir ce paramètre * / public static void download (httpservletResponse réponse, fichier de fichier, nom de fichier de chaîne) {téléchargement (réponse, fichier, nom de fichier, encodage); } / ** * Téléchargement du fichier * @param réponse * @param fichier de fichier * @param nom de fichier le nom du fichier téléchargé dans le navigateur. Si vous ne voulez pas que le nom de fichier soit téléchargé par le navigateur au même nom du fichier sur le serveur, veuillez définir ce paramètre * @param codage de nom de fichier Encoding * / public static void download (httpServletResponse Response, fichier file, string welename, String Encoding) {if (file == null || file.exists () || file.isdirctory () {retourne ;| } // Si vous ne spécifiez pas le nom du fichier à télécharger dans le navigateur, utilisez le nom par défaut du fichier if (stringUtils.isblank (filename)) {filename = file.getName (); } try {inputStream est = new FileInputStream (fichier); Télécharger (réponse, IS, nom de fichier, codage); } catch (ioException e) {e.printStackTrace (); }} / ** * Téléchargement de fichiers * @param réponse * @param est un flux d'entrée de fichier * @Param Nom de fichier de fichier Nom de fichier * @throws ioException * / public static void download (httpservletResponse réponse, inputStream is, String fileName) {download (réponse, is, fileName, Encoding); } / ** * Téléchargement de fichiers * @param réponse * @param est un flux d'entrée de fichier * @param nom de fichier de fichier Nom du fichier * @param format d'encodage d'encodage * / public static void download (httpServletResponse réponse, inputStream is, String FileName, String Encoding) {if (is == null || stringutiles.isblank (filename) {return; } BufferedInputStream bis = null; OutputStream os = null; BuffredOutputStream bos = null; essayez {bis = new BufferedInputStream (IS); OS = Response.getOutputStream (); BOS = nouveau tampondOutputStream (OS); Response.SetContentType ("Application / OCTET-Stream; charSet =" + Encoding); Response.Setcharacterencoding (codage); Response.sethEader ("Content-Disposition", "attachement; filename =" + urlencoder.encode (nom de fichier, codage)); octet [] tampon = nouveau octet [1024]; int len = bis.read (tampon); while (len! = -1) {bos.write (tampon, 0, len); len = bis.read (tampon); } bos.flush (); } catch (ioException e) {e.printStackTrace (); } enfin {if (bis! = null) {try {bis.close (); } catch (ioException e) {}} if (is! = null) {try {is.close (); } catch (ioException e) {}}}} public static String getEncoding () {return Encoding; } public static void setEncoding (String Encoding) {downloadUtils.encoding = Encoding; }}Si le fichier est enregistré dans un répertoire sans site sur le serveur
String filepath = "c: //file.zip"; DownloadUtils.Download (réponse, filepath);
Si le fichier est un flux d'entrée
// est le flux de fichiers Stream // le nom de fichier est le nom de fichier téléchargé par le navigateur // Encoding est le nom de fichier pour empêcher les codes brouillés lorsqu'il y a chinois dans la chaîne de fichier filename = "file.zip"; String Encoding = "UTF-8"; Téléchargées.download (réponse, IS, nom de fichier, codage);
Télécharger des fichiers dans Servlet
Package com.rhui.web.servlet; Importer java.io.ioException; Importer javax.servlet.servletException; Importer javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import com.rhui.util.downloadUtils; @WebServlet ("/ Download / Servlet") Classe publique DownloadServlet étend httpServlet {private static final long SerialVersionUID = 1l; Protégé du service void (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {String filepath = "c: //file.zip"; DownloadUtils.Download (réponse, filepath); }} PS: téléchargement d'image (y compris la fonction de lien anti-vol)
Package cn.itcast.day06.web.servlet; import java.io.ioException; import java.io.inputStream; import java.io.outputStream; import java.net.urlencoder; Importer javax.servlet.servletContext; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; La classe publique DownloadServlet étend HttpServlet {public void Doget (HttpServletRequest Request, HttpservletResponse Response) lève ServletException, ioException {// Implémentation de la fonction de chaîne anti-Theft // Obtenez l'en-tête référente pour expliquer où le visiteur vient de String référer = request.getheader ("référer"); if (référer == null ||! Refeger.startswith ("http: // localhost")) {// il s'agit d'un lien theef resens.sendRedirect ("/ day06 / index.jsp"); retour ; } // Résoudre le problème de la réponse Chinois Brizble Response Response.SetContentType ("Text / Html; charSet = UTF-8"); // Définit le codage du corps du message // L'en-tête de message de réponse HTTP envoyé via le protocole HTTP ne peut pas apparaître en chinois chinois, le chinois doit être un nom de chaîne codé par URL = Urlencoder.encode ("Beauty.jpg", "UTF-8"); // informez le navigateur pour lire la ressource Response.sethEader ("Content-Disposition", "Pixe; FileLame =" + FileName); // Lisez les données de l'image et envoyez-les à la chaîne de navigateur IE WebPath = "/download/beauty.jpg"; // équivalent au chemin de la voie de l'application Web actuelle servletContext servletContext = super.getServletContext (); InputStream dans = servletContext.getResourceSstream (webPath); OutputStream out = réponse.getOutputStream (); int len; octet [] tampon = nouveau octet [1024]; while ((len = in.read (tampon))! = - 1) out.write (tampon, 0, len); } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève ServletException, ioException {doget (request, réponse); }}