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

标签 java servlets content-disposition

我希望我的程序在文件开始下载之前有一个弹出式另存为窗口选项,但是当我运行我的 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/

相关文章:

java - JSF 2 - 从二进制数据生成图像

java - 自 API 29 以来,小部件点击振动不起作用

java - servlet 不将 session 属性转发给 jsp

java - 使用 Struts2 从服务器接收到重复的 header

utf-8 - 内容处理特殊字符

javascript - "Content-disposition"- 类似 Javascript 的行为

java - 如何使用 Java for Jenkins 使用 REST API 进行 POST

java - 让程序在自身内循环

java - 如何使用 Servlet 和 MySQL 正确读取 Java 中的重音字符?

java - 为什么 Jython Servlet post 请求中 fieldStorage 为空