网络文件的上传和下载(预览)简介

233 阅读4分钟

前言

平时开发中难免会碰到文件相关操作,无论是上传、下载图片、文档、视频等都是涉及到文件相关,本文就简单介绍一些文件上传、下载(预览)那点事

本文主要介绍 http 上传、下载,毕竟其使用范围广,毕竟是超文本传输协议的简称,无状态,我们的项目中更容易接触到,比较常见

ftp 的就不多介绍了,其是文件传输协议的的简称,看起来也更符合文件传输,其必须在整个会话中保留用户状态,主要用于一些专业的文件系统,对于大量文件或者大文件等传输,并且对外的网络传输基本也都是使用无状态的http传输,并且http目前更是开发者们接触最多的网络协议了

上传

http 上传我们最常用的就是 put、post,

对于 put 基本上就是放到 data或body 中,直接上传文件即可,基本上没有太多的操作

对于 post 也是放到 data或body 中,但其使用 formdata 的方式进行上传(multipart/form-data),也是广大应用使用最普遍的一种方式了(典型的小程序只支持这种方式),formdata相信大家都了解,也算是特殊分割处理的key-value形式的数据了,可以传递各种复杂多样的内容,除了基础参数,就是我么的file文件了,上传一般会加入名为 file 的keyvalue内容就是我们的文件二进制了,这样发出请求成功就代表上传成功了

如果需要监控传输进度就需要选择好自己的请求框架了,例如:前端选择 xhr、而不是 fetch

下载(预览)

这个也是我们接触比较多的,但平时也是碰到问题最少的,毕竟有大量成熟的图片、文件预览、下载库供大家使用,显得似乎没啥了,实际上还是有不少细节的,一旦碰到了,可能又是一鼻子灰哈

平时移动端、web端图片预览基本上直接放上一个链接,直接就能显示了,其背后经常可能拥有两个逻辑:

  • 每次通过网络下载预览显示
  • 下载到本地缓存,从缓存读取,第二次仍然是先以本地缓存显示,不存在在访问网络下载,缓存访问,以便于后续访问节省流量带宽

对于一个浏览器,我们有时会拿到一个链接,有时打开一个链接是直接下载到本地了,有时是直接在网页预览了,这是你怎么回事呢(平时在应用开发中如果没研究过是察觉不到的)

这就是http中的文件相关内容了

是否了解过 http 的响应头 headers 中有 Content-Typecontent-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