Java 实现一个简单的文件下载servlet

Java 实现一个简单的文件下载servlet,java,servlets,download,Java,Servlets,Download,我应该如何实现简单的文件下载servlet 其思想是使用GET请求index.jsp?filename=file.txt,用户可以下载file.txt从文件servlet下载,文件servlet会将该文件上传给用户 我可以获取文件,但如何实现文件下载?这取决于具体情况。如果所述文件通过HTTP服务器或servlet容器公开可用,则只需通过response.sendRedirect()重定向到即可 如果不是,则需要手动将其复制到响应输出流: OutputStream out = response.

我应该如何实现简单的文件下载servlet

其思想是使用GET请求
index.jsp?filename=file.txt
,用户可以下载
file.txt
从文件servlet下载,文件servlet会将该文件上传给用户


我可以获取文件,但如何实现文件下载?

这取决于具体情况。如果所述文件通过HTTP服务器或servlet容器公开可用,则只需通过
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();

当然,您需要处理适当的异常。

实现下载的最简单方法是将用户引导到文件位置,浏览器将自动为您执行此操作

您可以通过以下方式轻松实现:

HttpServletResponse.sendRedirect()

假设您可以访问servlet,如下所示

http://localhost:8080/myapp/download?id=7
我需要创建一个servlet并将其注册到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>
试用资源
并发送一个大文件

byte[] pdfData = getPDFData();

String fileType = "";

res.setContentType("application/pdf");

httpRes.setContentType("application/.pdf");
httpRes.addHeader("Content-Disposition", "attachment; filename=IDCards.pdf");
httpRes.setStatus(HttpServletResponse.SC_OK);
OutputStream out = res.getOutputStream();
System.out.println(pdfData.length);
         
out.write(pdfData);
System.out.println("sendDone");
out.flush();

内容配置和内容类型如何?请注意,“读取”while条件应该使用-1而不是0:
while((length=in.read(buffer))>-1)
@reformy 0也可以使用。如果读取的字节数为0,则无需写入输出。@chsply76如果由于到达文件末尾而没有更多数据,则文档会显示-1。为什么要冒险?可能磁盘暂时不可用,因此您得到0,但是否继续读取?@reformy在此处引用文档之前,您应该先完整阅读文档。请特别注意“此方法阻塞直到输入数据可用”和“读取并存储至少一个字节”等短语。注意,“读取”while条件应使用-1而不是0:
while((length=in.read(buffer))>-1)
使用annotation@WebServlet简化代码@WebServlet(description=“Download Servlet”,urlPatterns={“/download”})如果ID参数不是散列,攻击者可以尝试猜测其他ID并从您的数据库获取文件。另外,验证接收到的ID不包含任何SQL注入也是很好的。您应该认真考虑涉及的安全风险。例如,请参见“out”也必须位于try()块内。当你需要下载一个大文件(例如超过5MB)时,这种方法非常有用。如果未指定内容长度,客户端可能会关闭与服务器的TCP连接,然后会出现SocketException:connection reset by peer:socket write错误
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();
byte[] pdfData = getPDFData();

String fileType = "";

res.setContentType("application/pdf");

httpRes.setContentType("application/.pdf");
httpRes.addHeader("Content-Disposition", "attachment; filename=IDCards.pdf");
httpRes.setStatus(HttpServletResponse.SC_OK);
OutputStream out = res.getOutputStream();
System.out.println(pdfData.length);
         
out.write(pdfData);
System.out.println("sendDone");
out.flush();