【问题标题】:IE prompts to open or save json result which comes from serverIE 提示打开或保存来自服务器的 json 结果
【发布时间】:2014-01-10 13:25:45
【问题描述】:

我正在使用在 chrome 中运行良好的 blueimp fileupload 插件,虽然在 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
output Json 返回的是
ExcelUpload={UnprocessedRequests=12,AcceptedRequests=0, processesFlag=T,RejectedRequests=0,result=Excel_13}

春天的代码是

@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 的上传要求 JSON 响应的内容类型为 text/plain 或 text/html - 如果 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;

}

完成将响应内容类型设置为“文本/纯文本”,响应标题仍然没有运气。

【问题讨论】:

    标签: json spring internet-explorer blueimp


    【解决方案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>
    

    【讨论】:

    • 这对我有用。除了一个例外——我使用的是“text/plain”而不是“text/html”。
    【解决方案2】:

    根据设计,如果您将框架导航到返回 Content-Type: application/json 的 URL,IE 将提示用户保存文件,因为 IE 不提供 JSON 的本机视图。

    在您的服务器端代码中,您可以检查请求的 Accept 标头。如果它不包含application/json,那么你应该返回text/plain

    【讨论】:

    • 感谢 EircLaw,返回 text/plain 你的意思是 setContentType(MediaType.TEXT_PLAIN)
    • 看起来可以。您可以使用 Fiddler 或其他网络调试器进行确认。
    • 做了类似response.setContentType("text/plain; charset=UTF-8"); response.setHeader("Content-Type","text/plain; charset=UTF-8"); 的事情仍然得到 Content-Type=application/json; charset=UTF-8 在 IE 中
    • 最好更新原始问题中的代码以显示您的完整代码块,包括您的“if”测试等。
    • 我不知道“仍然没有运气”是什么意思。用 Fiddler 看 IE 响应时,Content-Type 是什么?
    【解决方案3】:

    这可能是因为 @ResponseBody 注释,我认为内容类型在您将其设置为 text/plain 后会重置为 application/json。 JacksonMessageConverter 可能与它有关。

    我在 Fiddler2 中看到 IE8 在其 Accept: 标头中发送 application/json。在服务器端,我检查 Accept 标头是否包含 application/json。 (顺便说一句,我只使用“contains()”而不是笨拙的“IndexOf”)如果 application/json 不在 Accept: 标头中,则将其替换为 text/plain。

    但果然,Fiddler2 得到的响应表明它的 Content-Type 标头为“application/json”。

    所以有些东西正在重置 Content-Type,之后我将它重置为 text/plain。

    我要试试这个:http://incomplete-code.blogspot.be/2012/08/spring-mvc-internet-explorer-7-and-json.html

    【讨论】:

      【解决方案4】:

      如果没有设置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

      【讨论】:

      • 目前,#3(上图)已死;但是,WayBack 从 2015 年 9 月 14 日起将其 here 命名为“Internet Explorer MIME 处理强制”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 2011-07-04
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多