Skip to content
techird edited this page Apr 6, 2016 · 1 revision

Step2. 把上传的图片存储到腾讯云 COS 服务中

本步骤完整源码在 workflow/step-2 分支上,提交记录为 c9709ee

上一步:Step1. 支持用户上传图片到云服务器

腾讯云对象存储服务(COS),适用于静态文件的存储。存储的静态文件会提供 CDN 加速,保障访问可靠性和速度。

在上一步中,我们已经把文件存储到了本地临时目录,在这一步,我们将要把它上传到 COS 服务中。

上传到 COS 流程图

腾讯云提供了 COS 服务的 Node SDK,我们可以通过 npm 进行安装:

npm instal qcloud_cos --save

基于 SDK 提供的 cos.upload() 方法,我们封装好项目使用的版本。

// lib/cos.js
'use strict';

const qcloud = require("qcloud_cos");
const conf = qcloud.conf;
const cos = qcloud.cos;

const appId = "10028115";
const secretId = "AKID3vtUR9S5SUFuM0uNW9T9gIpX3gDcZ4fA";
const secretKey = "hH9mBkzjWDwSGcDfzLJPTScCJ7uIWaTl";

conf.setAppInfo(appId, secretId, secretKey);

/**
 * @method upload()
 * 
 * 上传文件到 COS 服务
 * 
 * @param {string} filePath     要上传到 COS 的本地文件路径
 * @param {string} bucketName   指定上传到 COS 的目标 bucket
 * @param {string} destPath     指定上传到 Bucket 下的指定路径
 * @param {string} bizAttr      文件的额外信息
 * @param {Function(result)} callback  上传完成的回掉
 */
exports.upload = function(filePath, bucketName, dstPath, bizAttr, callback) {
    cos.upload(filePath, bucketName, dstPath, bizAttr, callback);
};

注意:要使用腾讯云 SDK,您需要获取应用的 appIdsecretIdsecrectKey,这些信息可以在腾讯云 COS 的控制台上点击「获取 API 密钥」按钮获取。

此时,COS 的上传方法准备完成,我们修改 Step1 中的上传流程,在文件保存到本地后,把本地文件上传到 COS 服务中。

// handle/upload.js
const path = require("path");
const fs = require("fs");
const cos = require('../lib/cos');

function upload(request, response) {
    // ...(省略 processUpload 部分)
    processUpload(request, response, uploadToServer);
    
    function uploadToServer(uploadError) {
        // ...
        // 此时文件已经上传到服务器本地,并且文件信息保存在 file 中
        console.log("#1. File uploaded to server:");
        console.log(JSON.stringify(file, null, 4));
        
        uploadToCos(file);
    }

    function uploadToCos(file) {
        // upload file to cos
        const uploadPath = `/uploads/${file.filename}${path.extname(file.originalname)}`;
        cos.upload(file.path, 'image', uploadPath, file.filename, (cosResult) => {
            
            console.log("#2. File uploaded to cos:");
            console.log(JSON.stringify(cosResult, null, 4));
            
            // upload to cos error
            if (cosResult.code) {
                print({ cosError: cosResult });
                return;
            }
            
            // clean up local store
            fs.unlink(file.path);
            
            print({ file, cosResult });
        });
    }
}

此时使用 Postman 上传文件,可以看到服务器输出:

上传到 COS

同时,服务器日志(pm2 logs)也输出如下。

#2. File uploaded to cos:
{
    "httpcode": 200,
    "code": 0,
    "message": "成功",
    "data": {
        "access_url": "http://image-10028115.file.myqcloud.com/uploads/0070468356c9dad63945ae5eca5e6914.png",
        "resource_path": "/uploads/0070468356c9dad63945ae5eca5e6914.png",
        "source_url": "http://image-10028115.cos.myqcloud.com/uploads/0070468356c9dad63945ae5eca5e6914.png",
        "url": "http://web.file.myqcloud.com/files/v1/uploads/0070468356c9dad63945ae5eca5e6914.png"
    }
}

可以看到,输出的 cosResult 包含了文件在 COS 服务器的相关信息,该信息将在下一步进一步使用。

同时,在文件上传到 COS 服务之后,上面的代码也把本地的文件删除,避免不必要的存储。

下一步:Step3. 把文件访问信息存储到 MongoDB 中