我希望我的程序在文件开始下载之前有一个弹出窗口保存作为窗口选项,但是当我运行我的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中通过右键单击运行它并运行为 – >在服务器上运行,Eclipse实际上会打开一个网页来显示结果.因此,您的程序现在是一个Web应用程序,Eclipse(或它打开的页面)是客户端.客户端正在保存您发送的信息,而不是您的程序.得到它了?
content-disposition标头仅用于建议下载的文件名.浏览器设置定义是否将打开“另存为”窗口.你无法控制它.
例如,在Google Chrome中,在设置/高级设置/下载中,可以选择询问在下载之前保存每个文件的位置.仅当选择此选项时,它才会打开所需的对话框.否则,它会将其保存在默认位置(也在浏览器设置中定义).所有浏览器都存在类似的选项.
另请注意,根据内容类型标题,浏览器将尝试显示内容,而不是下载内容.例如,浏览器将尝试显示文本和html.但是,您可以通过将标头设置为不可显示的类型来强制下载:
response.setContentType( “应用程序/八位字节流”);
如果您不想创建Web应用程序:由于您的程序在服务器上运行,它只是发送信息并完成.客户端程序决定如何处理它.在您目前的情况下,客户端是浏览器(或Eclipse打开浏览器页面).诸如content-disposition头之类的标题针对浏览器.如果您要创建自己的客户端(Swing客户端,Android应用程序,iPhone应用程序)不是浏览器,那么客户端将从服务器接收信息并决定如何处理它(显示它,或将其保存在任何客户端)方式),甚至忽略HTTP标头.