如果"内容类型"在浏览器中打印http响应和"内容 - 处置"写入http"响应"的OutputStream

时间:2014-03-19 04:32:16

标签: java http servlets http-headers

我有一个用例,我必须设置" Content-type"和"内容 - 处置"在http响应输出流中写入而不是作为文件下载。以下示例代码描述了案例: -

@Context
HttpServletResponse response;

@GET
@Produces(MediaType.TEXT_PLAIN)
public String downloadFile() throws IOException {

    File file = new File("/var/tmp/input.txt");
    FileInputStream fs = new FileInputStream(file);

    copyStream(fs, response.getOutputStream());

    response.setContentType("text/csv");
    response.setHeader("Content-Disposition","attachment;filename=\"" + "ts.csv" + "\"");

    return "";
}

当我提供一个小输入(input.txt文件)时,我的浏览器可以选择下载它,但是当输入很大时,它会直接在浏览器选项卡中打印文件内容。

我可以做什么指针,以便为大输入提供文件downoad选项?

1 个答案:

答案 0 :(得分:1)

根据ServletResponse.setContentType的文件:

  

如果尚未提交响应,则设置发送给客户端的响应的内容类型。

并且,根据ServletResponse.getWriter的文档:

  

返回可将字符文本发送到客户端的PrintWriter对象。

在您的编码中,您在设置response之前将内容写入content-type对象。

您应该没有写入响应输出流,以使您的自定义内容类型有效。

更改您的代码:

copyStream(fs, response.getOutputStream());

response.setContentType( "text/csv" );
response.setHeader( "Content-Disposition",
                    "attachment;filename=\"" + "ts.csv" + "\"" );

致:

response.setContentType( "text/csv" );
response.setHeader( "Content-Disposition",
                    "attachment;filename=\"" + "ts.csv" + "\"" );

copyStream(fs, response.getOutputStream());