gpt4 book ai didi

java - 如何强制浏览器下载文件?

转载 作者:IT老高 更新时间:2023-10-28 20:29:12 28 4
gpt4 key购买 nike

一切正常,但只有文件很小,大约 1MB,当我尝试使用更大的文件时,比如 20MB,我的浏览器显示它,而不是强制下载,到目前为止我尝试了很多标题,现在我的代码看起来:

PrintWriter out = response.getWriter();
String fileName = request.getParameter("filename");

File f= new File(fileName);

InputStream in = new FileInputStream(f);
BufferedInputStream bin = new BufferedInputStream(in);
DataInputStream din = new DataInputStream(bin);

while(din.available() > 0){
out.print(din.readLine());
out.print("\n");
}

response.setContentType("application/force-download");
response.setContentLength((int)f.length());
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition","attachment; filename=\"" + "xxx\"");//fileName);


in.close();
bin.close();
din.close();

最佳答案

在将文件内容写入输出流后,您正在设置响应 header 。在响应生命周期中设置 header 已经很晚了。正确的操作顺序应该是先设置headers,再将文件内容写入servlet的outputstream。

因此,你的方法应该写成如下(这不会编译,因为它只是一个表示):

response.setContentType("application/force-download");
response.setContentLength((int)f.length());
//response.setContentLength(-1);
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition","attachment; filename=\"" + "xxx\"");//fileName);
...
...
File f= new File(fileName);

InputStream in = new FileInputStream(f);
BufferedInputStream bin = new BufferedInputStream(in);
DataInputStream din = new DataInputStream(bin);

while(din.available() > 0){
out.print(din.readLine());
out.print("\n");
}

失败的原因是 servlet 发送的实际 header 可能与您打算发送的不同。毕竟,如果 servlet 容器不知道什么 headers(在 HTTP 响应中出现在 body 之前),那么它可能会设置适当的 headers 以确保响应有效;因此,在文件写入后设置 header 是徒劳且多余的,因为容器可能已经设置了 header 。您可以通过使用 Wireshark 或 Fiddler 或 WebScarab 等 HTTP 调试代理查看网络流量来确认这一点。

您还可以参阅 Java EE API 文档以获取 ServletResponse.setContentType了解这种行为:

Sets the content type of the response being sent to the client, if the response has not been committed yet. The given content type may include a character encoding specification, for example, text/html;charset=UTF-8. The response's character encoding is only set from the given content type if this method is called before getWriter is called.

This method may be called repeatedly to change content type and character encoding. This method has no effect if called after the response has been committed.

...

关于java - 如何强制浏览器下载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520231/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com