打开/另存为...对话框不显示(Open/Save as… dialog box not showi

2019-10-18 21:09发布

我有我的服务器我需要的用户从客户端下载的PDF文件。

使用Spring框架,我用javax.servlet.http.HttpServletResponse创建正确的反应和相应的头:

response.setHeader("Expires", "-1");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename="content.pdf");
response.setContentLength(content.size());

然后,我用的是ServletOutputStream的写的内容:

ServletOutputStream os;
try {
    os = response.getOutputStream();
    os.write(((ByteArrayOutputStream)baos).toByteArray());
    baos.close();
    os.flush();
    os.close();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

在客户端,我收到HTTP代码200和接收正确的响应体,与PDF文件,但“另存为...”弹出窗口没有出现。

有页眉的配置,可能导​​致该问题或可能是别的地方的原因吗?

谢谢。

Answer 1:

也许:

attachment; 空间 filename=content.pdf

更新

public static void download(HttpServletResponse response, File file, String downloadName) throws IOException
{
    if(file == null) throw new IllegalArgumentException("file is null");

    response.reset();
    response.setHeader("Content-Length", String.valueOf(file.length()));
    response.setContentType(new MimetypesFileTypeMap().getContentType(file));
    response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadName + "\"");

    InputStream input = new FileInputStream(file);

    try
    {
        OutputStream output = response.getOutputStream();

        try
        {
            IOUtils.copy(input, output);
        }
        catch(IOException e)
        {
            e.printStackTrace();

            throw e;
        }
        finally
        {
            output.close();
        }
    }
    catch(IOException e)
    {
        throw e;
    }
    finally
    {
        input.close();
    }
}

而我看到的唯一区别是在报头部分。 你试过没有缓存控制,编译和过期?

更新

没有差异在所有使用文件或流:

public static void download(HttpServletResponse response, InputStream input, String downloadName, String contenType) throws IOException
{
    response.reset();
    response.setHeader("Content-Length", String.valueOf(input.available()));
    response.setContentType(contenType);
    response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadName + "\"");

    OutputStream output = response.getOutputStream();
    IOUtils.copy(input, output);
    input.close();
}


Answer 2:

尝试将内容类型设置为application/octet-stream来代替:

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

这应该强制浏览器显示“另存为...”弹出窗口。 如果你把它设置为application/pdf浏览器识别文件类型,并显示它来代替。



Answer 3:

当我运行这段代码的问题排在

response.setHeader("Content-Disposition", "attachment;filename="content.pdf");

定义文件名

尝试:

response.setHeader("Content-Disposition", "attachment;filename="+"content.pdf");

这将打开对话框,并会给你点击Save按钮保存时作为选件



文章来源: Open/Save as… dialog box not showing