gpt4 book ai didi

java - 使用内容处置下载文件时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:46 26 4
gpt4 key购买 nike

我希望我的程序在文件开始下载之前有一个弹出式另存为窗口选项,但是当我运行我的 servlet 时它会自动开始下载文件。我在这里错过了什么?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletOutputStream outputStream = response.getOutputStream();
FileInputStream fis=new FileInputStream("E:/sound.mp3");
response.setContentLength(fis.available());
response.setContentType("audio/basic");
response.addHeader("content-disposition", "attachment;filename=abc.mp3");
while(true){
int read = fis.read();
if(read==-1)break;
outputStream.write(read);
}
fis.close();
}

最佳答案

您的程序不是桌面/独立程序,因为它是在服务器上运行的 servlet。当您在 Eclipse 中通过右键单击并 run as -> run on server 运行它时,Eclipse 实际上会打开一个网页来显示结果。因此,您的程序现在是一个 Web 应用程序,而 Eclipse(或它打开的页面)是客户端。客户端正在保存您发送的信息,而不是您的程序。明白了吗?

content-disposition header 仅用于建议下载的文件名。浏览器设置定义是否打开另存为 窗口。你无法控制它。

例如,在 Google Chrome 中,在 Setting/Advanced Setting/Downloads 中,有选项 Ask where to save下载前的每个文件。只有选择了这个选项,它才会打开你想要的对话框。否则它会将其保存在默认位置(也在浏览器设置中定义)。所有浏览器都存在类似的选项。

另请注意,根据 content-type header ,浏览器将尝试显示 内容,而不是下载 .例如,浏览器将尝试显示文本和 html。但是随后您可以通过将 header 设置为不可显示的类型来强制下载:

response.setContentType("application/octet-stream");

如果您不想创建 Web 应用程序:由于您的程序在服务器 上运行,它只是发送信息并完成。 客户端 程序决定如何处理它。在您目前的情况下,客户端是浏览器(或 Eclipse 打开浏览器页面)。 content-disposition 等 header 是针对浏览器的。如果您要创建自己的不是浏览器的客户端(Swing 客户端、Android 应用程序、iPhone 应用程序),那么客户端将从服务器接收信息并决定如何处理它(显示它,或将其保存在任何方式),甚至忽略 HTTP header 。

关于java - 使用内容处置下载文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26719754/

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