Idées de base:
L'idée précédente était de faire apparaître une boîte pour demander à l'utilisateur où il voulait stocker le fichier, puis j'ai généré un autre fichier et je l'ai mis là. Cependant, mon idée n'a pas réussi.
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, une balise <a>, href = "Adresse de méthode backend". Si vos besoins ne peuvent pas être directement utilisés dans l'hyperlien, vous pouvez l'écrire en js
window.location.href = "Adresse de méthode backend".
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.
Exemple
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 ("beey.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); }}