在Vue項目根據圖片url獲取file對象並用axios上傳

在Vue項目根據圖片url獲取file對象並用axios上傳

圖片url轉file對象

<script>
export default {
  data() {
    return {
	  ruleForm: {
        coverUrl: "",
        coverFile: ""
      },
    };
  },
  methods: {
    imgUrlToFile(url) {
      var self = this;
      var imgLink = url;
      var tempImage = new Image();
      //如果圖片url是網絡url,要加下一句代碼
      tempImage.crossOrigin = "*";
      tempImage.onload = function() {
        var base64 = self.getBase64Image(tempImage);
        var imgblob = self.base64toBlob(base64);
        var filename = self.getFileName(self.ruleForm.coverUrl);
        self.ruleForm.coverFile = self.blobToFile(imgblob, filename);
      };
      tempImage.src = imgLink;
    },
    getBase64Image(img) {
      var canvas = document.createElement("canvas");
      canvas.width = img.width;
      canvas.height = img.height;
      var ctx = canvas.getContext("2d");
      ctx.drawImage(img, 0, 0, img.width, img.height);
      var ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase();
      var dataURL = canvas.toDataURL("image/" + ext);
      return dataURL;
    },
    base64toBlob(base64) {
      let arr = base64.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr], { type: mime });
    },
    blobToFile(blob, filename) {
      // edge瀏覽器不支持new File對象,所以用以下方法兼容
      blob.lastModifiedDate = new Date();
      blob.name = filename;
      return blob;
    },
    getFileName(url) {
      // 獲取到文件名
      let pos = url.lastIndexOf("/"); // 查找最後一個/的位置
      return url.substring(pos + 1); // 截取最後一個/位置到字符長度,也就是截取文件名
    }
  }
};
</script>

axios上傳

注意,用以上方法得到file的對象在上傳時,還必須在表單的append方法中增加文件名,否則後端收到的只是blob對象,而不是文件,如下:

submitForm() {
    //...
	var filename = this.getFileName(this.ruleForm.coverUrl);
	params.append(
	  "course_cover",
	  this.ruleForm.coverFile,
	  filename
	);
	//....
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章