最近兩天老師給佈置了一個小任務。有一個頁面用到了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傳參位空。