我正在使用blueimp fileupload插件,它在chrome中工作正常,虽然在IE中没有工作,然后IE10。我收到提示打开或保存json结果。搜索后我尝试了几个解决方案。像这里一样: - https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation,但没有运气。
我正在使用Spring3.1,AngularJS。 用我的第一种方法我能够上传文件,虽然获得提示打开或保存IE中的json也是如此
Content-Type application/json;charset=UTF-8输出的Json返回
ExcelUpload={UnprocessedRequests=12,AcceptedRequests=0, processedFlag=T,RejectedRequests=0,result=Excel_13}
Spring代码是
@RequestMapping(value = "/saveExcel", method = RequestMethod.POST)
public @ResponseBody Map<String, Object> saveExcelDetails(@RequestParam(value="file",required=false) MultipartFile file,HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> excelUpload = myService.saveExcelDetails(request,file);
response.setHeader("Content-Type", "text/html; charset=utf-8");
return excelUpload;
}
然后我尝试了第二种方法
@RequestMapping(value = "/saveExcel", method = RequestMethod.POST,**produces = "text/html"**)
public @ResponseBody Map<String, Object> saveExcelDetails(@RequestParam(value="file",required=false) MultipartFile file,HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> excelUpload = myService.saveExcelDetails(request,file);
return excelUpload;
}
但是错误为“无法找到可接受的代表” 我在这里错过了什么
基于iframe的上传需要内容类型的text / plain或text / html用于JSON响应 - 如果iframe响应设置为application / json,它们将显示不需要的下载对话框。我们可以使用Accept标头为文件上传响应提供不同的内容类型。
我怎样才能实现
使用Accept标头为文件上传响应提供不同的内容类型。
在我的场景中(代码)。
Eric我按你的建议更改了
public @ResponseBody Map<String, Object>saveExcelDetails(@RequestParam(value="file",required=false) MultipartFile file,HttpServletRequest request, HttpServletResponse response,@RequestHeader(value="Accept") String accept) throws Exception {
Map<String, Object> excelUpload = myService.saveExcelDetails(request,file);
if (accept.indexOf("application/json") != -1) {
response.setContentType("application/json; charset=UTF-8");
} else {
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type","text/plain; charset=UTF-8");
}
return excelUpload;
}
完成设置响应内容类型为“text / plain”,也对响应Header仍然没有运气。
答案 0 :(得分:1)
请尝试以下代码:
<beans:bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:list>
<beans:value>text/html;charset=UTF-8</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="mappingJacksonHttpMessageConverter" />
</beans:list>
</beans:property>
</beans:bean>
答案 1 :(得分:0)
按照设计,IE将提示用户保存文件,如果您将帧导航到返回Content-Type: application/json
的URL,因为IE不提供JSON的本机视图。
在服务器端代码中,您可以检查请求的Accept
标头。如果它不包含application/json
,那么您应该返回text/plain
。
答案 2 :(得分:0)
可能是因为@ResponseBody注释,我认为在将其设置为text / plain后,内容类型会重置为application / json。 JacksonMessageConverter可能与它有关。
我在Fiddler2中看到IE8 不在其Accept:标头中发送application / json。在服务器端,如果它包含application / json,我会检查Accept标头。 (顺便说一下,我只使用“contains()”而不是笨重的“IndexOf”),如果application / json不在Accept:标题中,则用text / plain替换它。
但果然,响应Fiddler2会看到它的内容类型标题是'application / json'。
所以有些东西正在重置Content-Type,在之后重置为text / plain。
我要试试这个:http://incomplete-code.blogspot.be/2012/08/spring-mvc-internet-explorer-7-and-json.html
答案 3 :(得分:0)
header("X-Content-Type-Options", "nosniff");
,IE实际上会进行MIME检测,并覆盖服务器对IE检测到的格式的响应。例如,出于安全目的,带有text/html
标头的JSON响应将被text/javascript
覆盖。
参考: