打开/另存为...对话框未显示

时间:2013-11-01 10:53:08

标签: java servlets download http-headers response

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

使用Spring Framework,我使用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文件接收正确的响应正文,但没有出现“另存为...”弹出窗口。

Header配置上是否有任何可能导致此问题的原因或者是否可能是其他地方?

谢谢。

3 个答案:

答案 0 :(得分:0)

也许:

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();
}

答案 1 :(得分:0)

尝试将内容类型设置为application/octet-stream

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

这会强制浏览器显示“另存为...”弹出窗口。如果将其设置为application/pdf,则浏览器会识别文件类型并显示它。

答案 2 :(得分:0)

当我运行此代码时,问题出现在

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

用于定义文件名

尝试:

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

它将打开对话框,并在单击保存按钮

时为您提供保存选项