有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java打开/另存为。。。对话框不显示

我的服务器上有一个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文件,但“另存为…”弹出窗口没有出现

报头配置中是否存在导致此问题的原因,或者可能是其他原因

谢谢


共 (3) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

    当我运行这个代码时,问题出现了

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

    用于定义文件名

    试试看:

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

    它将打开对话框,并在单击“保存”按钮时为您提供“另存为”选项

  3. # 3 楼答案

    也许:

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

    我看到的唯一区别是标题部分。 你试过没有缓存控制、pragma和expires吗

    更新

    使用文件或流没有任何区别:

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