vue下载图片及文件

小鱼儿心语:人教人,教不会,事教人,一次就好,吃亏和吃饭一样,吃多了就会成长!
今天和大家分享下载不同格式的图片以及文件的方法!这也是我百度到天荒地老找到的最好用的方法,希望可以帮到你们!

一、首先使用 window.open() 下载文件: 在本页面打开并防止浏览器拦截

用window.open()直接打开请求地址或者返回的url,可能会因为跨域问题导致浏览器拦截
解决办法是:在请求前,打开一个窗口,然后将请求地址或者返回的url直接赋值给该窗口的href

downFileUrl() {
      var mywin = window.open('','_self');  //注意一定要在请求前操作此步,防止浏览器拦截
      downfileUrl().then(res => {  //这里是自己封装的ajax方法
          mywin.location.href = res.data.url;
      });
    }

二、废话不说,代码展示,复制即可用

downFileUrl() {
          var img = '后台返回的文件地址';  //注意需要拼接域名访问哦~
          const url = img;
          let xmlhttp = new XMLHttpRequest();
          xmlhttp.open("GET", url, true);
          xmlhttp.responseType = "blob";
          xmlhttp.onload = function () {
            if (this.status == 200) {
              const blob = this.response;
              const link = document.createElement("a");
              link.href = window.URL.createObjectURL(blob);
              link.download = '文件名称' + url.substring(url.lastIndexOf(".") + 1, url.length);
              //此写法兼容可火狐浏览器
              document.body.appendChild(link);
              const evt = document.createEvent("MouseEvents");
              evt.initEvent("click", false, false);
              link.dispatchEvent(evt);
              window.URL.revokeObjectURL(link.href);
              document.body.removeChild(link);
            }
          };
          xmlhttp.send();
    },

三、使用a标签进行下载

如果想通过纯前端技术实现文件下载,直接把a标签的href属性设置为文件路径即可,如下:
<a href="https://cdn.shopify.com/s/files/1/1545/3617/files/SH01_User_Manaul.pdf">附件下载</a>
但是,对于 txt , jpg , pdf 等浏览器支持直接打开的文件不会被执行下载,而是会直接打开,这时候一个新属性就要上场了--【download】,如下:
<a href="https://cdn.shopify.com/s/files/1/1545/3617/files/SH01_User_Manaul.pdf" download="test.pdf">附件下载</a>
仅管使用【download】,也会有不同的情况
  • 使用的地址是直接使用的IP端口的,原因就出在这里:当请求地址是ip的时候 a 标签的 download 属性无法生效。
    <a href="http://192.168.xx:8089/virtualPath/facility/document/2018/07/09/44a9a76a-084a-415a-9d50-e26ea28b55ce/0b48ed694ef510393ad2e829d6ec2fad.jpg" download="" class=""></a>
  • 解决办法:将ip改成域名
    <a href="http://www.xx.com/virtualPath/facility/document/2018/07/09/44a9a76a-084a-415a-9d50-e26ea28b55ce/0b48ed694ef510393ad2e829d6ec2fad.jpg" download="" class=""></a>
以下是我个人的实操,大家仅供参考,直接上图:
下载.png
如上图所示,点击 下载附件 下载不同类型的图片及文件;接下来废话不多说直接上代码:
<template>
  <div class="app-container">
    <el-dialog
      append-to-body
      :close-on-click-modal="false"
      :before-close="crud.cancelCU"
      :visible.sync="crud.status.cu > 0"
      title="隐患验收"
      width="690px"
      top="7vh"
    >
      <el-form ref="form" inline :model="form" :rules="rules" size="small" label-width="90px" >
         <el-form-item label="附件" prop="acceptfileName" label-width="90px">
          <el-upload
            ref="upload"
            :on-change="changeFileAccept"
            :auto-upload="false"
            :limit="1"
            :headers="headers"
            :action="hiddenUploadApi + '?fileName=' + form.acceptfileName"
            :file-list="acceptfileList"
          >
            <div
              class="eladmin-upload"
              @click="downFileUrl(form.id, '验收')"   //  点击下载附件按钮进行下载
              v-if="crud.isExamine == 'examinedetail'"
              style="width: 85px"
            >
              <i class="el-icon-download" />下载附件
            </div>
          </el-upload>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>
  • 以上是展示部分,点击下载附件进行下一步操作,直接复制即可用,具体的变量根据自身情况进行修改,代码如下:
通过后台返回的文件地址,与域名拼接进行下载~
我这里下载需要id参数以及type参数,大家可以根据具体情况进行修改
// 通过后台返回的地址,下载附件
    downFileUrl(id, type) {
      //注意一定要在请求前操作此步,防止下载跳转闪烁的问题
      var mywin = window.open('', '_self');
      downfileUrl(type ? crud.downUrlDanger : crud.downUrladdress, {
        parentId: id,
        module: type ? type : ''
      }).then(res => {
        // 图片常用格式
        let type = 'bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp,avif,apng'
        // 下载地址
        let content = crud.baseApiurl + res.data.path.slice(1, res.data.path.length);
        let arr = []
        arr = res.data.path.split('/')
        // 文件名
        crud.filename = res.data.name.split('.')[0] + '.'
        // 文件类型
        let suffix = arr[arr.length - 1].split('.')[1]
        // 文件大小
        let size = res.data.size / 1024 / 1024;
        // --------------------------文件大于10M的下载-------------------------------------------------
        if (size > 10 && type.indexOf(suffix) == -1) {
          mywin.location.href = crud.baseApiurl + res.data.path.slice(1, res.data.path.length);
        } else {
          // --------------------------图片文件下载(低于10MB的文件及所有类型图片)------------------------------
          var img = content;
          const url = img;
          // window.open(_this.detail.imgUrl)
          let xmlhttp = new XMLHttpRequest();
          xmlhttp.open("GET", url, true);
          xmlhttp.responseType = "blob";
          xmlhttp.onload = function () {
            if (this.status == 200) {
              const blob = this.response;
              const link = document.createElement("a");
              link.href = window.URL.createObjectURL(blob);
              // link.download = url.substring(url.lastIndexOf("/") + 1, url.length);
              link.download = crud.filename + url.substring(url.lastIndexOf(".") + 1, url.length);
              //此写法兼容可火狐浏览器
              document.body.appendChild(link);
              const evt = document.createEvent("MouseEvents");
              evt.initEvent("click", false, false);
              link.dispatchEvent(evt);
              window.URL.revokeObjectURL(link.href);
              document.body.removeChild(link);
            }
          };
          xmlhttp.send();
        }

      })
    },
以上就是目前我找到最好用的下载文件的方法了,大家如果有更好的,我们一起交流学习!喜欢小鱼儿的文章就关注我吧!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容