1. 程式人生 > >nodeJS 七牛雲上傳圖片 適用(7.2.1)

nodeJS 七牛雲上傳圖片 適用(7.2.1)

這周是讓我最難忘的一週,負責了一個需要上傳圖片的專案,但是公司的伺服器用來儲存圖片是不太靠譜的。所以遵照同事之前在專案中的技術方案,也用了七牛雲作為儲存圖片的儲存空間。

首先,在使用七牛之前一定要根據版本來使用,因為同事寫的七牛已經是有一段時間的了,所以在我給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;