Реализация простого сервлета загрузки файлов - PullRequest
41 голосов
/ 18 сентября 2009

Как мне реализовать простой сервлет загрузки файлов?

Идея состоит в том, что с помощью запроса GET index.jsp?filename=file.txt пользователь может загрузить, например. file.txt из файлового сервлета, и файловый сервлет загрузит этот файл пользователю.

Я могу получить файл, но как я могу осуществить загрузку файла?

Ответы [ 4 ]

61 голосов
/ 11 января 2013

Если у вас есть доступ к сервлету, как показано ниже

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

Мне нужно создать сервлет и зарегистрировать его в 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();
    }
}
50 голосов
/ 18 сентября 2009

Это зависит. Если указанный файл общедоступен через ваш сервер HTTP или контейнер сервлетов, вы можете просто перенаправить на него через response.sendRedirect().

Если это не так, вам нужно вручную скопировать его в поток вывода ответа:

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();

Вам, конечно, нужно будет обработать соответствующие исключения.

10 голосов
/ 27 марта 2015

Попробуйте с ресурсом

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();
2 голосов
/ 18 сентября 2009

Самый простой способ осуществить загрузку состоит в том, что вы перенаправляете пользователей в местоположение файла, браузеры сделают это автоматически.

Вы можете легко достичь этого с помощью:

HttpServletResponse.sendRedirect()
...