我希望我的程序在文件开始下载之前弹出另存为窗口选项,但是当我运行我的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();
}
答案 0 :(得分:6)
您的程序不是桌面/独立程序,因为它是在服务器上运行的servlet。通过右键单击run as
- >在Eclipse中运行它时run on server
,Eclipse实际上会打开一个网页来显示结果。因此,您的程序现在是一个Web应用程序,Eclipse(或它打开的页面)是客户端。客户端正在保存您发送的信息,而不是您的程序。知道了吗?
content-disposition
标题仅用于建议下载的文件名。浏览器设置定义是否打开另存为窗口。你无法控制它。
例如,在Google Chrome中,在Setting
/ Advanced Setting
/ Downloads
中,有Ask where to save each file before downloading
选项。仅当选择此选项时,它才会打开所需的对话框。否则,它会将其保存在默认位置(也在浏览器设置中定义)。所有浏览器都有类似的选项。
另请注意,根据content-type
标题,浏览器会尝试显示内容,而不是下载。例如,浏览器将尝试显示文本和html。但是,您可以通过将标头设置为不可显示的类型来强制下载:
response.setContentType("application/octet-stream");
如果您不想创建Web应用程序:由于您的程序在服务器上运行,因此它只是发送信息并完成。 客户端计划决定如何处理它。在您目前的情况下,客户端是浏览器(或Eclipse打开浏览器页面)。诸如content-disposition
标题之类的标题针对浏览器。如果您要创建自己的客户端(Swing客户端,Android应用程序,iPhone应用程序)而不是浏览器,那么客户端将从服务器接收信息并决定如何处理它(显示它,或将其保存在任何客户端)方式),甚至忽略HTTP标头。
答案 1 :(得分:2)
尝试查看此处:http://www.java2s.com/Code/Java/Swing-JFC/DemonstrationofFiledialogboxes.htm
在代码中取出主要语句,并将run(new FileChooserTest(), 250, 110);
放在您自己的代码中。如果我这样做,我会创建一个名为saveStatus
的int和3个等于0,1和2的名为waiting
,save
和cancel
的决赛。然后我会在你的其他编程中做一个while循环,看看saveStatus
是否等于waiting
来暂停你的程序(但不是对话框)。之后,我会发一个if语句来查看saveStatus
是否等于save
。如果是,请下载,如果没有,请不要下载。就这么简单。
答案 2 :(得分:2)
你的问题是Mime-Type。某些类型(特别是已知特定处理程序的类型)将由大多数浏览器直接下载。它确实有助于使用应用程序/二进制文件,但即使这样,一些浏览器也可能被配置为下载它或解释处置处理程序中的文件扩展名。
我认为大多数解决方案在下载链接之前在页面上使用javascript。
答案 3 :(得分:-1)
您必须手动实施对话框,例如(http://docs.oracle.com/javase/7/docs/api/javax/swing/JFileChooser.html)。用户选择文件后,您将能够启动http请求下载(到您的servlet)并将文件保存到所需的路径。