為了分攤個人服務器壓力、提升圖片下載上傳的速度,使用七牛雲保存用戶上傳的圖片。
后台基於express搭建的,上傳使用七牛雲第三方nodejs-sdk。由於七牛雲上傳圖片只能單個進行,並且考慮到上傳完成后會做一些事情,於是基於sdk再次封裝了一次,代碼如下:
let qn = require('qn');
let path = require('path');
// 本地文件路徑
let filePaths = ['./public/images/33.jpg', './public/images/1.jpg'];
let client = qn.create({
accessKey: 'ZfEZGc8IWw_WvLNYa8-J6LCHRifl8Y0Tmz1FOyg3',
secretKey: 'Y1sMVB-xUbyyrBfCdg1aH0zXY6p2ADTkz7OFLoCk',
bucket: 'fayinme', // 在七牛雲創建的空間名字
origin: 'opo2yekqx.bkt.clouddn.com', // 使用測試域名
});
let qiniuUpload = (filePaths) => {
// map()方法返回新的 promise對象數組,
// 若使用forEach(),報錯:Cannot read property 'Symbol(Symbol.iterator)' of undefined
// 因為沒有返回值,運行到 return Promise.all(qiniuPromise) 時會返回 undefinded
let qiniuPromise = filePaths.map(filePath => {
// key 為上傳到七牛雲后自定義圖片的名稱
return new Promise((resolve, reject) => {
let fileName = path.win32.basename(filePath);
client.uploadFile(filePath, {key: fileName}, function (err, result) {
if(err) {
reject(err);
}else {
resolve(result);
}
});
});
});
return Promise.all(qiniuPromise);
};
// 調用函數
qiniuUpload(filePaths).then(res => console.log(res));
注釋:
1、npm install --save qn
安裝 qn 模塊后require
2、封裝 qiniuUpload 函數,通過七牛雲上傳后返回一個 promise 對象
- 2.1 client.uploadFile(filePath, {key: fileName}, callback)
- filePath: 圖片在本地的路徑。
- fileName:上傳到七牛雲后自定義的圖片名字,本例使用原圖片名稱。
- callback:成功后的回調。
3、調用 qiniuUpload 函數,打印結果