【发布时间】:2013-04-12 15:13:09
【问题描述】:
我正在使用 Spring Web MVC 并编写了一个控制器,它将二进制数据返回到显示 3D 内容的网页中的插件。这个插件使用 STK 文件作为它的模型,所以我设置了我的 webapp 来为 *.stk URLs 生成这种内容
springDispatcherServlet 设置为在我的 web.xml 中处理 *.stk 请求
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>*.stk</url-pattern>
</servlet-mapping>
我的控制器如下所示:
@Controller
@RequestMapping(value="/3dobject", produces="application/octet-stream")
public class Object3DController {
@Autowired
private DesignerService designerService;
@RequestMapping(value="/{article}.stk", method=RequestMethod.GET, headers="Accept: application/octet-stream")
public void getObject3DForArticle(HttpServletResponse response, @PathVariable String article) throws IOException {
response.setContentType("application/octet-stream");
Object3D object = designerService.get3DModelForArticleNumber(article, LanguageCode.NORWEGIAN);
byte[] content = object.getContent();
response.setContentLength(content.length);
IOUtils.write(content, response.getOutputStream());
}
}
当我尝试通过浏览器访问数据时,出现以下错误:
HTTP 状态 406 - 此请求标识的资源只能生成具有根据请求“接受”标头不可接受的特征的响应。
我已将我的应用程序部署到本地主机上的 tomcat 服务器。
有什么想法可以让浏览器下载二进制数据吗?
PS!我从 *.3do(3d 对象)更改为 *.stk。使用 3do 它按预期工作,但插件失败并出现错误(这很难解释),所以我必须进行试验以验证 URL 扩展是否重要......
【问题讨论】:
-
我在 @RequestMapping 注释中添加了 headers="Acceot: application/octet-stream" 只是为了测试目的。它并没有像预期的那样改变任何东西。 :)
-
您发出的
HTTP请求的Accept 标头不正确或缺失。插件需要将 Accept 标头设置为application/octet-stream以访问产生application/octet-stream的控制器 -
目前我只用浏览器测试 URL,它有一个包含 */* 的 Accept 标头。我认为这意味着浏览器会加载任何内容..
-
仅供参考:来自浏览器的 Accept 标头是 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
-
插件错误是什么?
标签: spring-mvc http-headers httpresponse http-error