Exigences: implémentez une page Web avec la fonction de téléchargement de fichiers, téléchargeant principalement des packages et des images compressés:
1: Télécharger via l'hyperlien
Dans une page HTML, lien vers l'adresse du fichier à télécharger via un lien hypertexte
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>Download file through link</h1> <a href="/day06/download/cors.zip">Compression package</a> <a href="/day06/download/1.png">Picture</a> </ body> </html>
Lorsque Day06 / Download est le chemin du document, la structure du programme de cet exemple est la suivante:
Une fois le programme exécuté, vous pouvez le télécharger en cliquant sur le document que vous devez télécharger.
Mais un problème apparaîtra ici, c'est-à-dire que lorsque vous cliquez pour télécharger le package compressé, la page de téléchargement apparaîtra, mais lorsque vous téléchargez l'image, le navigateur ouvrira directement l'image et il n'y a pas de téléchargement.
En effet, lors du téléchargement d'un fichier via un lien hypertexte, si le navigateur peut reconnaître le format de fichier, le navigateur s'ouvrira directement. Le téléchargement ne sera réalisé que si le navigateur ne peut pas reconnaître le format de fichier. Par conséquent, la deuxième méthode est utilisée pour réaliser la fonction de téléchargement.
2: Implémentation de téléchargement via le programme servlet
Le principe de téléchargement de fichiers via Servlet est de lire le programme cible via Servlet et de retourner les ressources au client.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>Download file through link</h1> <a href="/day06/download/cors.zip">Compression package</a> <a href="/day06/download/1.png">Picture</a> <h1> Téléchargez le fichier via le programme servlet </h1> <a href = "/ day06 / servletdownload? filename = cors.zip"> package de compression </a> <a href = "/ day06 / servletdownload?
Où / Day06 / Servletdownload est le chemin de mappage du programme de servlet, puis crée un nouveau servlet, nom de servletdownload, et l'URL est mappée sur / servletdownload.
Ajoutez le code comme suit:
Package com.lsgjzhuwei.servlet.Response; import java.io.fileInputStream; Importer java.io.fileOutputStream; Importer java.io.ioException; import java.io.inputStream; import java.io.outputStream; Importer javax.servlet.servletException; Importer javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; / ** * Classe d'implémentation de servlet ServletDownload * / @webservlet (asyncSupported = true, urlpatterns = {"/ servletdownload"}) public class serpletdownload étend httpservlet {private static final SerialVersionUID = 1l; / ** * @see httpServlet # httpservlet () * / public servLetDownload () {super (); // Tobuteur de constructeur généré automatiquement TODO} / ** * @see httpservlet # doget (requête httpservletRequest, httpservletResponse Response) * / Protected void doget (httpservletRequest filename = request.getParameter ("filename"); System.out.println (nom de fichier); // Définissez le fichier MIME Type Response.SetContentType (getServletContext (). GetMiMetype (nom de fichier)); // Définit la réponse de contenu. // Lisez le fichier cible et écrivez le fichier cible au client via Response // Obtenez le chemin absolu de la chaîne de fichier cible fullFileName = getServletContext (). GetRealPath ("/ Download /" + FileName); //System.out.println(fullFileName); // Lire File InputStream dans = new FileInputStream (FullFileName); OutputStream out = réponse.getOutputStream (); // Write File int b; while ((b = in.read ())! = -1) {out.write (b); } in.close (); out.close (); } / ** * @SeE HttpServlet # doPost (HttpServLetRequest Request, HttpServletResponse Response) * / Protected void doPost (httpServLetRequest, httpservletResponse réponse) lance servletException, ioException {// too ateneated Method Stub}}} Redémarrez le serveur Tomcat pour réaliser le téléchargement de packages et d'images compressés.
Trois. Conseils:
La façon de télécharger des fichiers est très simple pour cliquer sur le lien. L'arrière-plan sort le flux de fichiers et réalise la fonction de téléchargement via le navigateur, y compris l'interrogation sur l'emplacement et le stockage de fichiers. La plupart des navigateurs configureront un emplacement fixe et peuvent ne pas demander à chaque fois.
Le front-end est très simple, avec une balise <a>, href = "Adresse de méthode backend". Si vos besoins ne peuvent pas être directement utilisés en mode hyperlien, vous pouvez écrire Window.location.href = "Adresse de méthode backend" dans JS.
Après avoir sauté sur la méthode d'arrière-plan
String filepath = this.getClass (). GetClassLoader (). GetResource (""). Touri (). GetPath () + "/exportpdf.pdf"; // Chemin du fichier dans le fichier de projet outfile = nouveau fichier (filepath); String filename = outfile.getName (); // Obtenez le nom de fichier inputStream fis = new BufferedInputStream (new FileInputStream (filePath)); octet [] buffer = nouveau octet [fis.available ()]; fis.read (tampon); // Lire le flux de fichiers fis.close (); réponse.RESET (); // Réinitialise le résultat Response.AddHeader ("Content-Disposition", "Pixe; FileLame =" + New String (filename.replaceALL ("", "") .getBytes ("utf-8"), "ISO8859-1")); // Renvoie le nom de fichier d'en-tête Response.AddHeader ("Content-Length", "" + OutFile.Length ()); // Renvoie la taille du fichier d'en-tête. // Définissez le type de données // Obtenez la sortie du corps de retour droit OUTPUTSTREAM OS = new BufferedOutputStream (Response.getOutputStream ()); OS.Write (Buffer); // Fichier de sortie os.flush (); os.close (); Le navigateur reconnaîtra directement cette forme de sortie de fichier et une boîte de dialogue apparaît.
Notez que cette méthode doit être ajustée en arrière-plan à l'aide de la méthode de lien. Il n'est pas possible d'utiliser des méthodes AJAX et XMLHTTPRequest. De cette façon, le flux de fichiers renvoyé sera renvoyé à la fonction de rappel de la méthode. Bien sûr, si vous souhaitez obtenir le fichier dans JS, cela fonctionnera.