复制粘贴出来的悲剧----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);
}
复制粘贴出来的悲剧----spring实现文件下载和HttpStatus.CREATED的更多相关文章
- Spring Tool Suite4(sts)复制粘贴卡顿(ctrl+v, ctrl+c)、按住ctrl也很卡
最近在看<Spring in Action, Fifth Edition>,下载了Spring Tool Suite4,在使用的过程中发现了一些问题: 只要在复制粘贴(ctrl+c, ct ...
- vim寄存器与复制粘贴的实现
对于大多数在Ubuntu下使用vim作为常用编辑器的同学来讲,他们遇到的第一个比较大的麻烦来自于vim与外部应用的复制粘贴. 当然,愿意选择ubuntu以及vim的同学肯定是google好手.不幸的是 ...
- Android中的复制粘贴
Android中的复制粘贴 The Clipboard Framework 当使用clipboard framework时,把数据放在一个剪切对象(clip object)里,然后这个对象会放在系统的 ...
- 远程桌面时plsql的复制粘贴功能失效
解决办法:重新启动远程桌面上的rdpclip进程就可以复制粘贴了,但是每次重开远程桌面都会出现同样的问题.可以rdpclip这个设置成开机启动.
- 不注册COM在Richedit中使OLE支持复制粘贴
正常情况下在Richedit中使用OLE,如果需要OLE支持复制粘贴,那么这个OLE对象必须是已经注册的COM对象. 注册COM很简单,关键问题在于注册时需要管理员权限,这样一来,如果希望APP做成绿 ...
- ios textfield / textview长按复制粘贴中文显示
当我们在写应用时要复制粘贴文本框内容时,默认显示的文字为英文字体,可按如下步骤设置,显示中文:
- ZeroClipboard跨浏览器复制粘贴
<!DOCTYPE html> <html> <head> <title>ZeroClipboard跨浏览器复制粘贴</title> < ...
- shutil复制粘贴和压缩
shutil复制粘贴和压缩 shutil 高级的文件.文件夹.压缩包处理模块 @1).将文件内容拷贝到另一个文件中 import shutil shutil.copyfileobj(open(&quo ...
- ubuntu快捷复制粘贴
今天使用putty,纠结复制粘贴的时候,才发现 原来只要选中文本后,就可以中键粘贴 整个桌面环境可用,新技能啊以前居然不知道
随机推荐
- 11.Configure Many-to-Many(配置多对多关系)【Code-First系列】
现在学习EF Code-First多对多的配置. 这里我们举例:学生和班级实体,一个学生可以选修多个课程,多个学生也可以选修同一个课程. 一.使用数据注解特性,配置多对多的关系 using Syste ...
- AngularJS----服务,表单,模块
AngularJS中的服务 服务是一个函数或对象,AngularJS中可以创建自己的服务或使用内建服务.$http是AngularJS中最常见的服务,服务向服务器发送请求,应用响应服务器传送过来的数据 ...
- 基于Metronic的Bootstrap开发框架经验总结(10)--优化Bootstrap图标管理
在基于Bootstrap开发的项目中,鲜艳颜色的按钮,以及丰富的图表是很吸引人的特点,为了将这个特点发挥到极致,可以利用Bootstrap图标抽取到数据库里面,并在界面中进行管理和使用,这样我们可以把 ...
- SQL Server中的GUID
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID ...
- 自己动手C#模拟电梯的运行V1.0
电梯调度有很多种模式,参见http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html 1.1先来先服务算法(FCFS) 先来先 ...
- C#怎样保证弹出窗体是唯一并居中显示
Winform窗体中,假如我从Form1窗体要弹出Form2窗体,写法是这样的: Form2 f2 = new Form2(); f2.Show(); 1.如何使窗体打开时居中显示 //初始化默认窗体 ...
- AbstractFactoryPattern(抽象工厂)
/** * 抽象工厂模式 * 分为四部分 * 1.产品接口 * 2.产品实例 * 3.工厂接口(生产同一个产品的不同等级,这里是主要区别) * 4.工厂实例 * 工厂类最好用单例模式,但在这里主要是说 ...
- GJM : 中断被Socket.Accept阻塞的线程
原帖地址:http://blog.csdn.net/kingfox/article/details/7233350 原文作者:狐帝 刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦.监听代码 ...
- 十一个行为模式之状态模式(State Pattern)
定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...
- .NET程序员走向高端必读书单汇总
.NET程序员走向高端必读书单汇总 一.知识树 1. 基本能力 1.1 数学 1.2 英语 1.3 语言表达 2. 计算机组织与体系结构 3. 算法与数据结构 4. 操作系统 5. 计算机网络 6. ...