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

Hel*_*rld 6 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();        
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*rcG 6

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

content-disposition头是那里才建议下载的文件名.浏览器设置定义是否将打开" 另存为"窗口.你无法控制它.

例如,在谷歌浏览器中,在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标头.