zoukankan      html  css  js  c++  java
  • 复制粘贴出来的悲剧----spring实现文件下载和HttpStatus.CREATED

    今天真是被自己的懒惰和复制粘贴给坑惨了...

    网上有这么一个spring下载文件的最佳实践:

    @RequestMapping("download")  
    public ResponseEntity<byte[]> download() throws IOException {  
        HttpHeaders headers = new HttpHeaders();  
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);  
        headers.setContentDispositionFormData("attachment", "xxx.txt");  
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(getDictionaryFile()),  
                                          headers, HttpStatus.CREATED);  
    }

    可以看到返回状态给的是HttpStatus.CREATED(201),这个当时想当然的认为既然是下载文件,肯定是新创建,所以create也没什么,也就没进一步仔细查询一下201状态码的意义.然后呢这段代码实际上在谷歌和火狐上执行是一点问题没有的,所以一直以来就这么复制粘贴复制再粘贴...直到今天发现这段代码实际上在ie上是有问题的.

    然后折腾了一下午加上一晚上,一直以为是MediaType的问题,换了n种方式依然未果.因为我知道这里返回HttpStatus.OK也是可以,所以只是麻木的各种尝试把它换成OK(200),结果在ie下真就好了.这才想起来仔细查询一下HttpStatus.CREATED(201)的含义,大体含义如下:

    服务器已经创建了文档,Location头给出了它的URL。

    源码中给的参考地址已经无法访问,所以只能简单的百度一下http状态码,上面只是其中的一种解释,但是大体都是说服务器已经创建了文档,这个实际上和下载文件没半点关系..

    所以正确的写法应该是:

    @RequestMapping("download")  
    public ResponseEntity<byte[]> download() throws IOException {  
        HttpHeaders headers = new HttpHeaders();  
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);  
        headers.setContentDispositionFormData("attachment", "xxx.txt");  
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(getDictionaryFile()),  
                                          headers, HttpStatus.OK);  
    }
  • 相关阅读:
    字符串截取例子 大小写转换 拼接例子 把oc转成c语言
    字符串比较 是否相同 大小 创建字符串 例子
    数组于字典:把多个字典放到数组中
    考核7
    Delphi 单元不能被循环引用
    Delphi ADOQuery无法更新定位行问题(其它数据库访问控件类似)
    SQL远程服务器操作数据
    s​p​c​o​m​m​属​性​详​解
    dxSkinController动态调入皮肤
    RegisterClass与GetClass
  • 原文地址:https://www.cnblogs.com/chyu/p/5277227.html
Copyright © 2011-2022 走看看