Java 如何强制浏览器使用来自Spring控制器的应用程序/八位字节流头

Java 如何强制浏览器使用来自Spring控制器的应用程序/八位字节流头,java,html,spring,Java,Html,Spring,我有一个页面,显示指向数据库中存储为blob的文件的链接。在多个浏览器中,链接之一是内联显示csv信息,而不是作为csv文件下载。用户可以右键单击并下载,但如何强制下载作为默认浏览器操作,因为内容类型和内容配置似乎不够。我使用的是Spring框架的旧版本(3.2.4) 编辑:如果我没有设置标题,所有链接都将以内联方式显示。 此外,当设置了标题时,Safari控制台中报告了一个错误,该错误适用于下载但未内联显示的链接: “加载资源失败:帧加载中断” //前端代码 //弹簧控制器 @RequestM

我有一个页面,显示指向数据库中存储为blob的文件的链接。在多个浏览器中,链接之一是内联显示csv信息,而不是作为csv文件下载。用户可以右键单击并下载,但如何强制下载作为默认浏览器操作,因为内容类型和内容配置似乎不够。我使用的是Spring框架的旧版本(3.2.4)

编辑:如果我没有设置标题,所有链接都将以内联方式显示。 此外,当设置了标题时,Safari控制台中报告了一个错误,该错误适用于下载但未内联显示的链接:

“加载资源失败:帧加载中断”

//前端代码
//弹簧控制器
@RequestMapping(value=“/test/file/errors/{id}”,method=RequestMethod.GET)
public void downloadFile(@PathVariable(“id”)长id,
HttpServletResponse(响应){
InputError文件=commonService.get(InputError.class,id);
试一试{
InputStream is=newbytearrayinputstream(file.getFile());
copy(is,response.getOutputStream());
response.setContentType(MediaType.APPLICATION\u OCTET\u STREAM\u VALUE);
response.setHeader(“内容处置”、“附件;文件名=\”+文件.getFilename()+”\”);
response.flushBuffer();
}捕获(IOEX异常){
抛出新的RuntimeException(“将文件写入输出流时出错”);
}
}

您是否尝试过使用html5中引入的下载属性

<td><a id="downloadFile" href="<c:url value='/test/file/errors/${fileError.id}'/>" 
class=".icon-download" download="filename_here.txt"> 
<span class=".icon-download"></span>${fileError.filename}</a></td>

正如Benoit所提到的,如果您可以使用HTML5,下载选项将起作用

然而,尽管有点吹毛求疵,你目前的答案应该是有效的。在本例中,您是否尝试过为MIME类型使用适当的大小写

Content-Type="application/octet-stream"
使用Spring的MediaType类的部分价值在于从代码中删除像这样的“幻数”值,并确保不会发生奇怪的行为

response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);

如果其他人也有同样的问题,我通过在IOUtils.copy之前设置头来解决这个问题

response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getFilename() + "\"");
IOUtils.copy(is, response.getOutputStream());

谢谢,我试过了,但是没有用,文件仍然通过浏览器内联显示。谢谢,我试过添加html 5 doctype、download属性和spring mediatype常量,但是仍然不起作用。我也在chrome中进行了测试,链接可以正常工作(有或没有建议的更改),但与IE或Safari兼容。
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getFilename() + "\"");
IOUtils.copy(is, response.getOutputStream());