前端圖片下載的實現


前端圖片下載分為兩大類:

一是服務端配合實現(即下載后台服務提供的資源);

二是純前端下載;

1.服務端配合實現

這種情況對於前端開發來說非常簡單,只需呀一個a標簽,如:

 

<a href='/api/download' >下載圖片</a>

當直接訪問的某個文件時,如果該文件是二進制等瀏覽器無法解析的文件,瀏覽器才會下載該文件,

但如果瀏覽器可以自己解析該文件,則它會打開該文件並以自己的方式呈現出來,而不會下載,

此時就需要設置消息響應頭,告訴瀏覽器該文件需要下載而不是簡單的打開。 

這時候后台要提供一個get請求的服務,並設置消息響應頭,告訴瀏覽器該文件需要下載。以node為例:

app.get('/api/download/', (req, res, next) => {//以文件流的形式下載文件
    var filePath = path.join(__dirname, '../src/images/erwei.jpg');
    var stats = fs.statSync(filePath);
    res.set({
        'Content-Type': 'application/octet-stream', //告訴瀏覽器這是一個二進制文件
        'Content-Disposition': 'attachment; filename=111', //告訴瀏覽器這是一個需要下載的文件
        'Content-Length': stats.size  //文件大小
    });
    fs.createReadStream(filePath).pipe(res);
});

2.純前端下載

這其中又分為兩種情況:一是下載同源圖片(如同項目文件夾中的圖片);二是 跨域網站的靜態資源(如自己公司的CDN的靜態資源)

a.下載同源圖片

這種情況很簡單 利用a標簽的 downlaod 就可以實現,例

<a href=‘../img/test.png’ download="img" >下載圖片</a>

b.下載跨域網站的圖片

借助canvas,例

// 調用方式
// 參數一: src
// 參數二: 圖片名稱,可選
export const downloadImage = (src: string, name: string) => {
    const image = new Image();
    // 解決跨域 canvas 污染問題
    image.setAttribute('crossOrigin','anonymous');
    image.onload = function(){
      const canvas = document.createElement('canvas');
      canvas.width = image.width;
      canvas.height = image.height;
      const context = canvas.getContext('2d');
      context.drawImage(image,0,0,image.width,image.height);
      const url = canvas.toDataURL('image/png');
      // 生成一個 a 標簽
      const a = document.createElement('a');
      // 創建一個點擊事件
      const event = new MouseEvent('click');
      // 將 a 的 download 屬性設置為我們想要下載的圖片的名稱,若 name 不存在則使用'圖片'作為默認名稱
      a.download = name || '圖片';
      // 將生成的 URL 設置為 a.href 屬性
      a.href = url;
      // 觸發 a 的點擊事件
      a.dispatchEvent(event);
    };
    image.src = src
}

 


免責聲明!

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



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