七牛雲存儲 遠程抓取圖片保存到指定空間(nodejs版),以及自定義key

最近兩天老師給佈置了一個小任務。有一個頁面用到了UEditor文本編輯器,用戶經常會直接粘貼整篇文檔到編輯區,包括很多圖片。圖片的來源都是粘貼來源的地址,這可能大大影響圖片的加載效率,以及如果源地址刪除該圖片,文章也無法正常顯示。我要做的就是從該文章中,提取所有的圖片,保存到七牛雲存儲。這樣,每次顯示文章,就能直接從自己的雲存儲加載圖片。 
  首先,我的大概思路是: 獲取正片文章內容,正則匹配出所有的img標籤,然後再匹配出每個img標籤的src屬性值,也就是獲得了每張圖片的源地址。本來不瞭解七牛雲,所以在如何上傳到七牛雲上卡住了。剛好到了週末,就趁着這兩天時間,大概過了一下七牛api文檔,瞭解到了fetch接口進行遠程資源抓取。 
  以下上代碼:

1. 獲取所有圖片的源地址

// 匹配出所有的img標籤 
const imgPtn = /<img\b.*?(?:>|\/>)/gi; 
// 匹配出每個img標籤中的src屬性 
const srcPtn = /src=['"]?([^'"]*)['"]?/i; 
let images; 
if (content) { 
    images = content.match(imgPtn); // 獲取圖片 
} 
 if (images) { // 文本編輯區有圖片 
    images.forEach(function (list)  { 
    if (list.match(srcPtn)) { 
        // 獲取srcs數組,並去除每個src的 " " 符號 
        srcs.push(list.match(srcPtn)[0].split('=')[1].slice(1, -1)); 
    } 
} 


個人需要,對srcs進行過濾,獲得指定域名的來源的圖片src。

2.進行遠程抓取

  function fetchImg(url, bucket, key, callback) { 
     qiniu.conf.ACCESS_KEY = "自己的accesskey"; 
     qiniu.conf.SECRET_KEY =   "自己的secretkey"  ; 
     const client = new qiniu.rs.Client(); 
     key =  `/images/ ${md5(new Date().getTime())}`; // 可以自己定義key的前綴 
     client.fetch(url, bucket, key, function (err, ret) { 
     if (err) { 
        console.log(err); 
    } else { 
        console.log(ret); 
    } 
 });


  可以看到,key值我是自定義的images/圖片名。 這主要使用md5對當前時間進行hash,保證圖片命名的唯一性。

  但有一缺點就是: 如果key傳參爲空的時候,七牛會自定義生成key,而且上傳同一張圖片的時候,將會覆蓋,也就說不會存在完全相同的兩張圖片。

   如果自定義key值,就要保證圖片命名的唯一性,而以上辦法,雖然做到了這點,但無法對同一張圖片進行覆蓋上傳。

   因爲對time進行hash,基本不會得到完全相同的圖片名。

// 通過fetch進行遠程圖片抓取,qiniu.rs中有對應的api
fetchImg(url, bucket, '', callback);  
調用的時候key傳參位空。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章