当前位置: 首页 > 面试题库 >

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

岳鸿畴
2023-03-14
问题内容

一切正常,但是只有当文件很小(大约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();

问题答案:

在将文件内容写入输出流之后,你将设置响应头。在响应生命周期中设置标头很晚。正确的操作顺序应该是首先设置头,然后将文件的内容写入servlet的输出流。

因此,你的方法应编写如下(由于仅是表示形式,因此不会编译):

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发送的实际标头可能与你要发送的标头不同。毕竟,如果Servlet容器不知道什么标头(出现在HTTP响应的主体之前),则可以设置适当的标头以确保响应有效;因此,在文件写入之后设置标头是没有用的,而且是多余的,因为容器可能已经设置了标头。你可以通过使用Wireshark或HTTP调试代理(例如Fiddler或WebScarab)查看网络流量来确认这一点。

你也可以参考ServletResponse.setContentType的Java EE API文档来了解此行为:

如果尚未提交响应,则设置要发送给客户端的响应的内容类型。给定的内容类型可以包括字符编码规范,例如text / html; charset = UTF-8。如果在调用getWriter之前调用此方法,则仅根据给定的内容类型设置响应的字符编码。

可以重复调用此方法以更改内容类型和字符编码。如果在提交响应后调用此方法,则该方法无效。



 类似资料:
  • 问题内容: 单击图像后,是否可以将其下载(没有右键单击 将图像另存为 )? 我正在使用一个小的Javascript函数来调用下载页面: 在download.php页面中,我有类似以下内容: 但这是行不通的。我究竟做错了什么? 提前致谢! 问题答案: 使用 application / octet- stream 代替 image / jpg : 如果在应用程序/八位字节流内容类型的响应中使用[Con

  • 问题内容: 使用JAVA,我试图强制浏览器下载文件。 这是我当前使用的代码: 它 几乎可以 正常工作,但是当强制下载文档(MS Office 2007+)时,下载的文件已损坏(至少,这是MS Office告诉我的)。如果尝试在存储它们的服务器上直接打开它,则不会出现该错误,这意味着下载时(而不是上传时)确实会干扰该问题。 根据IANA的说法,此类文件的MIME类型应为 (1) ,但是指定MIME类

  • 我的项目是一个web应用程序。 目前,它有一种生成文本文件并将其发送到客户端浏览器下载的方法。 我需要修改它,以强制浏览器将文件保存在客户端计算机上的自定义(预定义)位置。

  • 问题内容: 我希望在我的一个站点的每个视频下方添加“下载此文件”功能。我需要强迫用户下载文件,而不仅仅是链接到文件,因为有时这会开始在浏览器中播放文件。问题是,视频文件存储在单独的服务器上。 有什么办法可以强制用PHP下载吗? 问题答案: 您可以尝试这样的事情: 我刚刚测试了它,它对我有用。 请注意,为了能够读取远程URL,您需要启用它。

  • 问题内容: 我注意到一些浏览器(特别是Firefox和Opera)非常热衷于使用.css和.js文件的缓存副本,即使在浏览器会话之间也是如此。当你更新这些文件之一但用户的浏览器继续使用缓存的副本时,这会导致出现问题。 问题是:强制用户浏览器在文件更改后重新加载文件的最优雅方法是什么? 理想情况下,该解决方案不会强制浏览器在每次访问页面时重新加载文件。我将发布自己的解决方案作为答案,但我很好奇是否有

  • 问题内容: 我在客户端生成图像,并使用HTML显示如下: 我想提供下载生成的图像的可能性。 我怎么能知道浏览器正在打开文件保存对话框(或者只是将chrome或firefox这样的图像下载到下载文件夹中即可),从而允许用户保存图像 而无需右键单击并另存为 图像? 我希望没有服务器交互的解决方案。因此,我知道如果我先上传图像然后开始下载,那将是可能的。 非常感谢! 问题答案: 只需替换为。客户端不会将