前端 vue ios axios segmentfault 瀏覽器 app post this 欄目 iOS 简体版
原文   原文鏈接

本文整理了前端經常使用的下載文件以及上傳文件的方法
例子均以vue+element ui+axios爲例,不使用el封裝好的上傳組件,這裏自行進行封裝實現前端

先附上demo

上傳文件

以圖片爲例,文件上傳能夠省略預覽圖片功能

圖片上傳可使用2種方式:文件流base64;vue

1.文件流上傳+預覽

<input type="file" id='imgBlob' @change='changeImgBlob' />
  <el-image style="width: 100px; height: 100px" :src="imgBlobSrc"></el-image>
// data
imgBlobSrc: ""

// methods
changeImgBlob() {
      let file = document.querySelector("#imgBlob");
      /**
       *圖片預覽
       *更適合PC端,兼容ie7+,主要功能點是window.URL.createObjectURL
       */
      var ua = navigator.userAgent.toLowerCase();
      if (/msie/.test(ua)) {
        this.imgBlobSrc = file.value;
      } else {
        this.imgBlobSrc = window.URL.createObjectURL(file.files[0]);
      }
      //上傳後臺
      const fd = new FormData();
      fd.append("files", file.files[0]);
      fd.append("xxxx", 11111); //其餘字段,根據實際狀況來
      axios({
        url: "/yoorUrl", //URL,根據實際狀況來
        method: "post",
        headers: { "Content-Type": "multipart/form-data" },
        data: fd
      });
}

瀏覽器network查看
image.png
image.png
img元素查看src,爲blob類型
image.pngios

2.Base64上傳+預覽

<input type="file" id='imgBase' @change='changeImgBase' />
<el-image style="width: 100px; height: 100px" :src="imgBaseSrc"></el-image>
// data
imgBaseSrc : ""

// methods
    changeImgBase() {
      let that = this;
      let file = document.querySelector("#imgBase");
      /**
      *圖片預覽
      *更適合H5頁面,兼容ie10+,圖片base64顯示,主要功能點是FileReader和readAsDataURL
      */
      if (window.FileReader) {
        var fr = new FileReader();
        fr.onloadend = function (e) {
          that.imgBaseSrc = e.target.result;
          //上傳後臺
          axios({
            url: "/yoorUrl", //URL,根據實際狀況來
            method: "post",
            data: {
              files: that.imgBaseSrc
            }
          });
        };
        fr.readAsDataURL(file.files[0]);
      }
    }

瀏覽器network查看
image.pngaxios

img元素查看src,爲base64類型
image.pngsegmentfault

下載文件

圖片下載

假設須要下載圖片爲url文件流處理和這個同樣瀏覽器

<el-image style="width: 100px; height: 100px" :src="downloadImgSrc"></el-image>
  <el-button type="warning" round plain size="mini" @click='downloadImg'>點擊下載</el-button>
//data
 downloadImgSrc:'https://i.picsum.photos/id/452/400/300.jpg?hmac=0-o_NOka_K6sQ_sUD84nxkExoDk3Bc0Qi7Y541CQZEs'
//methods
downloadImg() {
      axios({
        url: this.downloadImgSrc, //URL,根據實際狀況來
        method: "get",
        responseType: "blob"
      }).then(function (response) {
        const link = document.createElement("a");
        let blob = new Blob([response.data], { type: response.data.type });
        let url = URL.createObjectURL(blob);
        link.href = url;
        link.download = `實際須要的文件名.${response.data.type.split('/')[1]}`;
        link.click();
        document.body.removeChild(link);
      });
    }

文件下載(以pdf爲例)

<el-image style="width: 100px; height: 100px" :src="downloadImgSrc"></el-image>
  <el-button type="warning" round plain size="mini" @click='downloadImg'>點擊下載</el-button>
//data
 downloadImgSrc:'https://i.picsum.photos/id/452/400/300.jpg?hmac=0-o_NOka_K6sQ_sUD84nxkExoDk3Bc0Qi7Y541CQZEs'
//methods
downloadImg() {
      axios({
        url: this.downloadImgSrc, //URL,根據實際狀況來
        method: "get",
        responseType: "blob"
      }).then(function (response) {
        const link = document.createElement("a");
        let blob = new Blob([response.data], { type: response.data.type });
        let url = URL.createObjectURL(blob);
        link.href = url;
        link.download = `實際須要的文件名.${response.data.type.split('/')[1]}`;
        link.click();
        document.body.removeChild(link);
      });
    }

pdf預覽能夠參考如何預覽以及下載pdf文件

小結

demo複習

圖片上傳可使用2種方式文件流Base64
圖片下載同理。
更多問題歡迎加入前端交流羣交流749539640app

相關文章
相關標籤/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公眾號
   歡迎關注本站公眾號,獲取更多信息