IE提示打开或保存来自服务器的json结果

时间:2014-01-10 13:25:46

标签: json spring internet-explorer blueimp

我正在使用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仍然没有运气。

4 个答案:

答案 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覆盖。

参考:

  1. MIME Type Detection in Windows Internet Explorer

  2. Handling MIME Types in Windows Internet Explorer

  3. Handling MIME Types in Windows Internet Explorer

  4. Wiki: MIME Sniffing