文件下载的文件名设置

工作一年多了,以前写的下载都是图片下载,也没有觉得什么不对,终于在前两天发现了问题。别人的apk文件上传了以后下载下来变成了zip,后缀不对。于是我也好奇了,我看有的网站明明是支持上传的文件名是什么,下载的时候也是什么,他们是怎么做到的?

于是我百度了下关于下载时设置文件名,果然和response中的Content-Disposition这个属性有关。Content-Disposition的作为 main body的header的语法如下:

1
2
3
Content-Disposition: inline
Content-Disposition: attachment
Content-Disposition: attachment; filename="filename.jpg"

直接在浏览器中打开就是inline,这是默认值;如果作为附件下载就使用attachment,会使用浏览器下载。
所以我们在下载文件的时候需要attachment,并且可以设置文件名。

所以在代码中加上

1
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));

网上还有人说,文件名中有中文会有乱码的问题,在此暂时不讨论。这样就可以是下载文件、图片,而不是在浏览器中直接打开。所以图片作为image的元素的时候用inline,需要保存的时候是用attachment。