Vue实现文件上传和文件下载

灰太狼 2022-05-15 01:22 439阅读 0赞

文件下载:
文件下载通常有几种方法
1.通过url下载
2.location.href
3.form提交直接下载
4.HTML5 a.download结合blob对象进行下载
第一种方式:
第一种方法是前后端的接口只给了一个API请求:
前端第一个实现是使用a标签,

第二种方式:
这个方法是直接把 DataURLs 或者 BlogURLs 传到浏览器地址中触发下载。有两种方式:

  1. window.location.href = urls; // 本窗口打开下载
  2. window.open(urls, '_blank'); // 新开窗口下载

第三种:
标签的download是HTML5标准新增的属性,作用是指示浏览器下载URL而不是导航到URL,因此将提示用户将其保存为本地文件。
这种是定义的接口不是下载文件的路径,而是通过API可以获得文件的内容,由前端把内容写入到文件中,这种方法是通过获取文件信息,在网页上利用click事件,创建一个文件,然后将文件信息写入到文件中,然后保存

  1. this.content = content
  2. this.filename = filename
  3. const blob = new Blob([this.content])
  4. if (window.navigator.msSaveOrOpenBlob) {
  5. // 兼容IE10
  6. navigator.msSaveBlob(blob, this.filename)
  7. } else {
  8. // chrome/firefox
  9. let aTag = document.createElement('a')
  10. aTag.download = this.filename
  11. aTag.href = URL.createObjectURL(blob)
  12. aTag.click()
  13. URL.revokeObjectURL(aTag.href)
  14. }

第四种form表单
不需要我们处理返回二进制流直接下载,非常方便
form的action设置为接口地址,method设置为post,Post到后台的数据设置为input的属性 name = key,value = value的形式,如果有多个key、value的值要传递,那么就设置多个input来分别储存单个的key、value;
如果请求的接口可以不需要参数,那么input还是必须要一个,如果不要得话 会引起接口报错
原理:form的action相当于一个浏览器本页签/页面的一个请求,不会被后台,前台的路由拦截。所以能够提交成功。

注意点:如果设置method为get,在action中的uri添加了参数的话,想用这个参数替代input的key、value形式来提交到后台,这参数是没有效果的,后台拿不到这些参数,真正的参数还是以input的name、value的形式储存,在submit方法执行后传递到后台。
这样我们就是实现了文件下载,但是表单提交的数据一般是简单的键值对,如果传参比较复杂可以考虑将表单序列化提交。

因为项目是基于vue的,而且提交的请求参数涉及很多参数,比较复杂,所以采用了方法三来实现

  1. axios.post('/rest/inventory/oh_status/info/excel', {
  2. site: this.selectedsite,
  3. bu: this.selectedbu,
  4. ohHealthStatus: this.selectedtitle,
  5. ohHealthRootcause: this.selectedblock,
  6. search: this.search,
  7. sort: this.sort
  8. }, {responseType: 'arraybuffer'}).then(this.ExportFile).catch(function (error) {
  9. console.log(error)
  10. })
  11. this.content = content
  12. this.filename = filename
  13. const blob = new Blob([this.content])
  14. if (window.navigator.msSaveOrOpenBlob) {
  15. // 兼容IE10
  16. navigator.msSaveBlob(blob, this.filename)
  17. } else {
  18. // chrome/firefox
  19. let aTag = document.createElement('a')
  20. aTag.download = this.filename
  21. aTag.href = URL.createObjectURL(blob)
  22. aTag.click()
  23. URL.revokeObjectURL(aTag.href)
  24. }

注意我们发送请求的时候一定要写上responseType,{responseType: 'arraybuffer'} 否则下载下来的文件打不开!!!

文件上传
文件上传通常使用form表单,但是有时候我们不想要用表单,ES6的fromData来实现

  1. handleGetFile (data) {
  2. this.file = data
  3. let formdata = new FormData()
  4. formdata.append('file', this.file)
  5. formdata.append('submit', false)
  6. let config = {
  7. headers: {
  8. 'Content-Type': 'multipart/form-data'
  9. }
  10. }
  11. axios.post('/rest/master_data/ct2r/odin_delivery_metrics/cvc/file_upload_review', formdata, config).then(this.sendFileSucc)
  12. },

首先 我们获取完文件之后,创建FormData对象,配置头部,发送该请求就OK了,别忘了让后台将接收头部请求改为formdata的格式

如果文件是图片或者视频的话,部分浏览器会直接打开,非下载,这个时候我们可以在下载链接 url 后面加上 ?response-content-type=application/octet-stream 这个参数可以实现点击下载功能。

发表评论

表情:
评论列表 (有 0 条评论,439人围观)

还没有评论,来说两句吧...

相关阅读