IE提示打开或保存来自服务器的json结果
我正在使用blueimp fileupload插件,该插件在chrome中运行良好,但在IE10以下的IE中不起作用。我收到了打开或保存json结果的提示。搜索后,我尝试了一些解决方案。就像这里的一个:-,但没有运气 我正在使用Spring3.1,AngularJS。 在我的第一种方法中,我能够上传文件,尽管也会得到在IE中打开或保存json的提示 Content-Type application/json;charset=UTF-8 内容类型应用/json;charset=UTF-8返回的输出Json为 ExcelUpload={UnprocessedRequests=12,AcceptedRequests=0, processedFlag=T,RejectedRequests=0,result=Excel_13} ExcelUpload={UnprocessedRequests=12,AcceptedRequests=0,processedFlag=T,RejectedRequests=0,result=Excel_13} Spring代码是IE提示打开或保存来自服务器的json结果,json,spring,internet-explorer,blueimp,Json,Spring,Internet Explorer,Blueimp,我正在使用blueimp fileupload插件,该插件在chrome中运行良好,但在IE10以下的IE中不起作用。我收到了打开或保存json结果的提示。搜索后,我尝试了一些解决方案。就像这里的一个:-,但没有运气 我正在使用Spring3.1,AngularJS。 在我的第一种方法中,我能够上传文件,尽管也会得到在IE中打开或保存json的提示 Content-Type application/json;charset=UTF-8 内容类型应用/json;charset=UTF-8返回的
@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)
public@ResponseBody映射saveExcelDetails(@RequestParam(value=“file”,required=false)多部分文件文件、HttpServletRequest请求、HttpServletResponse响应)引发异常{
Map excelUpload=myService.saveExcelDetails(请求、文件);
setHeader(“内容类型”,“text/html;charset=utf-8”);
返回并上传;
}
然后我尝试了第二种方法
@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;
}
@RequestMapping(value=“/saveExcel”,method=RequestMethod.POST,**products=“text/html”**)
public@ResponseBody映射saveExcelDetails(@RequestParam(value=“file”,required=false)多部分文件文件、HttpServletRequest请求、HttpServletResponse响应)引发异常{
Map excelUpload=myService.saveExcelDetails(请求、文件);
返回并上传;
}
但获取错误为“找不到可接受的表示形式”
我是不是遗漏了什么
基于Iframe的上传要求JSON响应的内容类型为text/plain或text/html-如果Iframe响应设置为application/JSON,则会显示不需要的下载对话框。我们可以使用Accept标头为文件上传响应提供不同的内容类型
我怎样才能达到目标
使用Accept标头为文件上载响应提供不同的内容类型
在我的场景(代码)中
埃里克,我按照你的建议改了
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;
public@responseBy MapsaveExcelDetails(@RequestParam(value=“file”,required=false)多部分文件文件、HttpServletRequest请求、HttpServletResponse响应、@RequestHeader(value=“Accept”)字符串接受)引发异常{
Map excelUpload=myService.saveExcelDetails(请求、文件);
if(accept.indexOf(“application/json”)!=-1{
setContentType(“application/json;charset=UTF-8”);
}否则{
response.setContentType(“文本/普通”);
响应。setCharacterEncoding(“UTF-8”);
setHeader(“内容类型”,“文本/普通;字符集=UTF-8”);
}
返回并上传;
}
已将响应内容类型设置为“text/plain”,响应标题也设置为“text/plain”,但仍然不成功。根据设计,如果将框架导航到返回
内容类型:application/json
的URL,IE将提示用户保存文件,因为IE不提供json的本机视图
在服务器端代码中,可以检查请求的
Accept
头。如果它不包含application/json
,那么您应该返回text/plain
。这可能是因为@ResponseBody注释,我认为内容类型在设置为text/plain后重置为application/json。JacksonMessageConverter可能与此有关
我在Fiddler2中看到IE8在其Accept:header中不是发送application/json。在服务器端,我检查Accept头是否包含application/json。(顺便说一句,我只使用“contains()”而不是笨重的“IndexOf”),如果application/json不在Accept:header中,则将其替换为text/plain
但果不其然,响应Fiddler2会看到它有一个“application/json”的内容类型头
因此,在我将内容类型重置为文本/纯文本后,正在重置内容类型
我将尝试以下操作:尝试以下代码:
<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>
text/html;字符集=UTF-8
如果标题(“X-Content-Type-Options”,“nosniff”),IE实际上会执行MIME检测未设置代码>并覆盖服务器对IE检测到的格式的响应。例如,出于安全目的,带有text/html
标题的JSON响应将被text/javascript
覆盖
参考:
谢谢EircLaw,返回text/plain
您的意思是setContentType(MediaType.text\u plain)
。这样看起来就可以了。您可以使用Fiddler或其他网络调试器进行确认;setHeader(“内容类型”,“文本/普通;字符集=UTF-8”)代码>仍在获取内容类型=应用程序/json;IEIt中的charset=UTF-8可能最好更新原始问题中的代码,以显示完整的代码块,包括“if”测试等。我不知道“仍然没有运气”是什么意思。当你看IE使用Fiddler时,内容类型是什么?这对我很有用。除了一个例外——我使用的是“text/plain”而不是“text/html”。目前,#3(上面)已经死了;然而,WayBack从2015年9月14日起将其命名为“Internet Explorer MIME处理强制执行”。