web-dev-qa-db-fra.com

Implémentation d'un servlet de téléchargement de fichier simple

Comment dois-je implémenter un servlet de téléchargement de fichiers simple?

L'idée est qu'avec la requête GET index.jsp?filename=file.txt, l'utilisateur peut télécharger par exemple. file.txt à partir du servlet de fichier et le servlet de fichier téléchargerait ce fichier à l'utilisateur.

Je peux obtenir le fichier, mais comment puis-je implémenter le téléchargement de fichier?

43
newbie

Ça dépend. Si ce fichier est accessible au public via votre serveur HTTP ou conteneur de servlet, vous pouvez simplement rediriger vers via response.sendRedirect().

Si ce n'est pas le cas, vous devrez le copier manuellement dans le flux de sortie de réponse:

OutputStream out = response.getOutputStream();
FileInputStream in = new FileInputStream(my_file);
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0){
    out.write(buffer, 0, length);
}
in.close();
out.flush();

Vous devrez bien sûr gérer les exceptions appropriées.

51
ChssPly76

En supposant que vous avez accès au servlet comme ci-dessous

http://localhost:8080/myapp/download?id=7

J'ai besoin de créer un servlet et de l'enregistrer sur web.xml

web.xml

<servlet>
     <servlet-name>DownloadServlet</servlet-name>
     <servlet-class>com.myapp.servlet.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name>DownloadServlet</servlet-name>
     <url-pattern>/download</url-pattern>
</servlet-mapping>

DownloadServlet.Java

public class DownloadServlet extends HttpServlet {


    protected void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

         String id = request.getParameter("id");

         String fileName = "";
         String fileType = "";
         // Find this file id in database to get file name, and file type

         // You must tell the browser the file type you are going to send
         // for example application/pdf, text/plain, text/html, image/jpg
         response.setContentType(fileType);

         // Make sure to show the download dialog
         response.setHeader("Content-disposition","attachment; filename=yourcustomfilename.pdf");

         // Assume file name is retrieved from database
         // For example D:\\file\\test.pdf

         File my_file = new File(fileName);

         // This should send the file to browser
         OutputStream out = response.getOutputStream();
         FileInputStream in = new FileInputStream(my_file);
         byte[] buffer = new byte[4096];
         int length;
         while ((length = in.read(buffer)) > 0){
            out.write(buffer, 0, length);
         }
         in.close();
         out.flush();
    }
}
62
Wen

Essayez avec Resource

File file = new File("Foo.txt");
try (PrintStream ps = new PrintStream(file)) {
   ps.println("Bar");
}
response.setContentType("application/octet-stream");
response.setContentLength((int) file.length());
response.setHeader( "Content-Disposition",
         String.format("attachment; filename=\"%s\"", file.getName()));

OutputStream out = response.getOutputStream();
try (FileInputStream in = new FileInputStream(file)) {
    byte[] buffer = new byte[4096];
    int length;
    while ((length = in.read(buffer)) > 0) {
        out.write(buffer, 0, length);
    }
}
out.flush();
11
Sorter

La façon la plus simple d'implémenter le téléchargement est de diriger les utilisateurs vers l'emplacement du fichier, les navigateurs le feront automatiquement pour vous.

Vous pouvez facilement y parvenir grâce à:

HttpServletResponse.sendRedirect()
3
Winston Chen