nodeJS 七牛雲上傳圖片 適用(7.2.1)
阿新 • • 發佈:2019-01-09
這周是讓我最難忘的一週,負責了一個需要上傳圖片的專案,但是公司的伺服器用來儲存圖片是不太靠譜的。所以遵照同事之前在專案中的技術方案,也用了七牛雲作為儲存圖片的儲存空間。
首先,在使用七牛之前一定要根據版本來使用,因為同事寫的七牛已經是有一段時間的了,所以在我給node專案裝七牛的時候,想直接使用他們的程式碼,但在除錯的過程中發現已經不能適用了。
npm install qiniu (適用 v7.2.1版本)
所以就只能我自己來手寫一個新的上傳圖片的工具,下面是程式碼。
實現上傳到七牛的有三個步驟:
1、將這個key 與 accessKey 與 secretKey 作為鑑權獲得一個mac
2、獲取檔案的檔名作為一個key,並通過 mac 獲得對應檔案的token
3、將這個token與 上傳的檔名,與路徑 作為 資料 呼叫七牛提供的API (這時成功的話七牛會返回一個 hash 和 一個key,並且檔案已經上傳到七牛了, 憑藉七牛提供的 domain 就可以獲得檔案的url)
以下是我的程式碼, 已經做過封裝了(抱歉這個星期加班了五天,不能仔細解釋程式碼, 今晚就這樣)
var qiniu = require("qiniu"); var qiniuConfig = new qiniu.conf.Config(); var fs = require('fs'); // 空間對應的機房 qiniuConfig.zone = qiniu.zone.Zone_z0; var ACCESS_KEY = sysConf.qiniu.accessKey; var SECRET_KEY = sysConf.qiniu.secretKey; var mac = new qiniu.auth.digest.Mac(ACCESS_KEY, SECRET_KEY); var tool = { run: run, }; function run(req, res) { var fileInfo = req.body.fileInfo; return new Promise( function (resolve, reject) { async.waterfall( [ function (callback) { callback(null, fileInfo); //必須放在這裡非同步返回 }, function (fileInfo, callback) { getToken(fileInfo, callback); }, function (tokenInfo, callback) { uploadFile(tokenInfo, callback); }, function (uploadRes, callback) { resolve(uploadRes); } ], function (errmsg, result) { reject(errmsg); }); } ); } //構建上傳策略函式,設定回撥的url以及需要回調給業務伺服器的資料 function getToken(fileInfo, callback) { try { for (var key in fileInfo) { var putPolicy = new qiniu.rs.PutPolicy({scope: sysConf.qiniu.bucket + ":" + fileInfo[key].filename}); fileInfo[key]['token'] = putPolicy.uploadToken(mac); } callback(null, fileInfo); } catch (err) { callback('七牛獲取token失敗', null); } } //構造上傳函式 function uploadFile(tokenInfo, callback) { var formUploader = new qiniu.form_up.FormUploader(qiniuConfig); var putExtra = new qiniu.form_up.PutExtra(); var resData = []; for (var key in tokenInfo) { formUploader.putFile(tokenInfo[key]['token'], tokenInfo[key]['filename'], tokenInfo[key]['path'], putExtra, function (err, body, info) { if (!err) { resData.push(sysConf.qiniu.domain + '/' + body.key); var path = sysConf.multer.path + body.key; console.log('---------- qiniuHelper.js.() line:64() path='); console.dir(path); fs.unlinkSync(path); if (resData.length >= tokenInfo.length) { console.log('/helpers/qiniuHelper.js line 75 resData = '); console.dir(resData); callback(null, resData); } } else { // 上傳失敗, 處理返回程式碼 console.log('/helpers/qiniuHelper.js line 63 err = '); console.dir(err); callback('七牛圖片上傳失敗', null); } }); } } module.exports = tool;