美文网首页前端
vue下载图片及文件

vue下载图片及文件

作者: 小鱼儿_逆流而上 | 来源:发表于2021-07-08 16:38 被阅读0次
    小鱼儿心语:人教人,教不会,事教人,一次就好,吃亏和吃饭一样,吃多了就会成长!
    今天和大家分享下载不同格式的图片以及文件的方法!这也是我百度到天荒地老找到的最好用的方法,希望可以帮到你们!

    一、首先使用 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();
            }
    
          })
        },
    
    以上就是目前我找到最好用的下载文件的方法了,大家如果有更好的,我们一起交流学习!喜欢小鱼儿的文章就关注我吧!

    相关文章

      网友评论

        本文标题:vue下载图片及文件

        本文链接:https://www.haomeiwen.com/subject/iyrtpltx.html