使用content-disposition下载文件时出现问题

6
我希望我的程序在开始下载文件之前有一个弹出的“另存为”窗口选项,然而当我运行我的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();        
}

请查看以下网址:https://dev59.com/sm865IYBdhLWcg3wduWH 和 https://dev59.com/i3E95IYBdhLWcg3wn_b2。 - Danilo Muñoz
1
据我所见,上述两种情况与我的不同,但感谢关注。@DaniloMuñoz - Hello World
你如何调用你的Servlet? - Ken de Guzman
1
@HelloWorld 提供额外信息,例如如何访问您的“servlet”以及在哪里运行该“servlet”。 - Santhosh
1
@shekharsuman 那不是重复选项。 - Luiggi Mendoza
显示剩余12条评论
4个回答

6

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

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

例如,在Google Chrome中,在设置/高级设置/下载中,有选项每次下载前询问我要把文件保存到哪里。只有选择了这个选项,它才会打开你想要的对话框。否则,它将保存在默认位置(也在浏览器设置中定义)。所有浏览器都有类似的选项。

请注意,根据content-type头部的不同,浏览器将尝试显示内容,而不是下载它。例如,浏览器将尝试显示文本和HTML。但是,你可以通过将头部设置为不可显示类型来强制下载:

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

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


2

请看这里:http://www.java2s.com/Code/Java/Swing-JFC/DemonstrationofFiledialogboxes.htm

将他们代码中的主语句移除并在您自己的代码中添加run(new FileChooserTest(), 250, 110);。如果我在做的话,我会创建一个名为saveStatus的整数和三个常量分别命名为waitingsavecancel,它们的值分别为0、1和2。然后,在您的其他编程中,我会使用while循环来检查saveStatus是否等于waiting以暂停您的程序(但不是对话框)。之后,我会创建一个if语句来检查saveStatus是否等于save。如果是,则下载,否则不下载。就这么简单。


2

你的问题是 Mime-Type。有些类型(特别是那些已知特定处理程序的类型)将直接被大多数浏览器下载。使用 application/binary 可以稍微有所帮助,但即使如此,有些浏览器可能会配置为下载它或解释附加的文件名扩展名。

我认为大多数解决方案在下载链接之前在页面上使用 JavaScript。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接