前言
平时开发中难免会碰到文件相关操作,无论是上传、下载图片、文档、视频等都是涉及到文件相关,本文就简单介绍一些文件上传、下载(预览)那点事
本文主要介绍 http 上传、下载,毕竟其使用范围广,毕竟是超文本传输协议的简称,无状态,我们的项目中更容易接触到,比较常见
ftp 的就不多介绍了,其是文件传输协议的的简称,看起来也更符合文件传输,其必须在整个会话中保留用户状态,主要用于一些专业的文件系统,对于大量文件或者大文件等传输,并且对外的网络传输基本也都是使用无状态的http传输,并且http目前更是开发者们接触最多的网络协议了
上传
http 上传我们最常用的就是 put、post,
对于 put 基本上就是放到 data或body 中,直接上传文件即可,基本上没有太多的操作
对于 post 也是放到 data或body 中,但其使用 formdata 的方式进行上传(multipart/form-data),也是广大应用使用最普遍的一种方式了(典型的小程序只支持这种方式),formdata相信大家都了解,也算是特殊分割处理的key-value形式的数据了,可以传递各种复杂多样的内容,除了基础参数,就是我么的file文件了,上传一般会加入名为 file 的key,value内容就是我们的文件二进制了,这样发出请求成功就代表上传成功了
如果需要监控传输进度就需要选择好自己的请求框架了,例如:前端选择 xhr、而不是 fetch
下载(预览)
这个也是我们接触比较多的,但平时也是碰到问题最少的,毕竟有大量成熟的图片、文件预览、下载库供大家使用,显得似乎没啥了,实际上还是有不少细节的,一旦碰到了,可能又是一鼻子灰哈
平时移动端、web端图片预览基本上直接放上一个链接,直接就能显示了,其背后经常可能拥有两个逻辑:
- 每次通过网络下载预览显示
- 下载到本地缓存,从缓存读取,第二次仍然是先以本地缓存显示,不存在在访问网络下载,缓存访问,以便于后续访问节省流量带宽
对于一个浏览器,我们有时会拿到一个链接,有时打开一个链接是直接下载到本地了,有时是直接在网页预览了,这是你怎么回事呢(平时在应用开发中如果没研究过是察觉不到的)
这就是http中的文件相关内容了
是否了解过 http 的响应头 headers 中有 Content-Type、content-disposition,这个就是类型与扩展相关的字段,其中content-disposition 为 MIME 协议的扩展 ,其作用就是用来处理一些文件的显示问题
Content-Type:指定文件的 MIME 类型,application/octet-stream 表示其他情况默认二进制,text/plain 表示文本文件的默认值,,此外如果设置其他,例如:application/pdf表示PDF文件,image/png表示PNG图片。(我看要在打开浏览器预览、小程序webview预览的基本上标注这个就行了,下面的根本不用设置)content-disposition的值,MIME协议的扩展,表示如何处置附加的文件- 值为
attachment时,表示它应该下载,当然前提是如果 filename 存在值,保存时会预填入原始名文件名(而不是后端唯一值的文件名),例如: content-disposition: attachment;filename=原始名.png 。下载时需要原始名字是,有些用的。
- 值为
如果了解了上面的相信就能处理好文件的下载、预览问题了(这个一般是在后端处理,前端很多时候无能为力),只不过浏览器若是不支持预览,仍然会转换成下载或者无法显示,这就是没办法的事情了
常见的 MIME 类型
就简单介绍几个吧,实际上还有很多,一搜基本就出来
- 超文本标记语言文本 .html、.html:text/html
- 普通文本 .txt: text/plain
- RTF 文本 .rtf: application/rtf
- GIF 图形 .gif: image/gif
- JPEG 图形 .jpeg、.jpg、png: image/jpeg、image/png
- PDF文件 .pdf: application/pdf
- au 声音文件 .au: audio/basic
- MIDI 音乐文件 mid、.midi: audio/midi、audio/x-midi
- RealAudio 音乐文件 .ra、.ram: audio/x-pn-realaudio
- MPEG 文件 .mpg、.mpeg: video/mpeg
- AVI 文件 .avi: video/x-msvideo
- GZIP 文件 .gz: application/x-gzip
- TAR 文件 .tar: application/x-tar