vue項目根據后台返回的url下載圖片處理a標簽無法下載問題


  1. 原因:<a>標簽通過download 屬性下載文件只適用於同源的文件
    <a download="自定義圖片名" href="url">下載同源圖片</a>

     

  2. 非同源的時候<a>標簽的download屬性無效,會發生跳轉,並不會下載

  3. 解決:非同源下實現下載
    情景1:如果存在CORS問題,先將圖片轉成base64 :(親測有效)
    downloadIamge(imgsrc, name) {//下載圖片地址和自定義圖片名稱
    let image = new Image();
    // 解決跨域 Canvas 污染問題
    image.setAttribute("crossOrigin", "anonymous");
    image.onload = function() {
     let canvas = document.createElement("canvas");
     canvas.width = image.width;
     canvas.height = image.height;
     let context = canvas.getContext("2d");
     context.drawImage(image, 0, 0, image.width, image.height);
     let url = canvas.toDataURL("image/png"); //得到圖片的base64編碼數據
     let a = document.createElement("a"); // 生成一個a元素
     let event = new MouseEvent("click"); // 創建一個單擊事件
     a.download = name || "qrcode.jpg"; // 設置圖片名稱
     a.href = url; // 將生成的URL設置為a.href屬性
     a.dispatchEvent(event); // 觸發a的單擊事件
    };
    image.src = imgsrc;
    }
    
    
    情景2:如果不存在CORS問題,可以借助Blob實現下載(構造xhr請求文件地址, 以Blob的形式接收Response):
    function downloadWithBlob(url,name) {
     fetch(url).then(res => res.blob().then(blob => {
      var a = document.createElement('a');
      var url = window.URL.createObjectURL(blob);
      var filename = name || 'qrcode.jpg';
      a.href = url;
      a.download = filename;
      a.click();
      window.URL.revokeObjectURL(url);
     }));
    }
    
    
    情景3:如果有文件content:
    function funDownload(content, filename) {
        var eleLink = document.createElement('a');
        eleLink.download = filename;
        eleLink.style.display = 'none';
        // 字符內容轉變成blob地址
        var blob = new Blob([content]);
        eleLink.href = URL.createObjectURL(blob);
        // 觸發點擊
        document.body.appendChild(eleLink);
        eleLink.click();
        document.body.removeChild(eleLink);
    };

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM