java - HTTP 状态 406 – 不可接受 [使用 spring 4.3.x + Java 8 从后端流式传输大量数据]
问题描述
我正在使用 Spring mvc 4.3.x、java 8、Tomcat 7
代码:
@Controller
public class StreamRecordsController {
@RequestMapping(value = "/streamrecords", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE,
produces = "application/octet-stream")
@ResponseBody
public ResponseEntity<StreamingResponseBody> export() throws FileNotFoundException {
File file = new File("C:\\Users\\Ankur\\sample.pdf");
StreamingResponseBody responseBody = outputStream -> {
Files.copy(file.toPath(), outputStream);
};
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=generic_file_name.pdf")
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(responseBody);
}
}
例外:
邮递员快照
我在这里想念什么?
解决方案
发生在您身上的可能是 Spring MVC 错误。对于浏览器,它也因浏览器而异 - 请求中的接受标头是强制性的,具有正确的值。您可能会在不同的浏览器中获得不同的行为,并且您的代码可能会在 swagger UI 中运行。
根据您的屏幕截图,您的 Accept 标头与响应类型不匹配,这应该是*/*
因为您的代码是特殊的,因为您不接受任何输入,这在 REST 世界中是一种罕见的情况。
所以我建议在你的映射中添加消耗,如下所示,看看它是否有效,
@RequestMapping(value = "/streamrecords", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE)
并确保请求中的 Accept 标头带有值 - */*
。
推荐阅读
- java - 绑定列表内节点的用户数据更改?
- python - 张量流中张量对象的非连续索引切片(高级索引,如numpy)
- java - 如何从子产品列表中找到产品的最低价格
- merge - 如何检查文件是否未在 Clearcase 中合并?
- c++ - 使用 < 1e-14 的数字时,QLineSeries 不显示
- scala - 如何定义一个参数类型不能为 Any 的 scala 方法
- java - 使用 SwipeAdapter 在滑动中保留由 OnClick 事件设置的自定义字符串值
- minizinc - 如何提高 MiniZinc 解决 Set Covering 问题的速度?
- node.js - 你如何让特定的人做命令
- css - 使用 TextArea 标签时如何更改 textarea 的宽度