前言:
COS是騰訊云提供的對象存儲服務(wù),功能非常強大,可以作為文件服務(wù)器,CDN加速,靜態(tài)網(wǎng)頁服務(wù),還提供了圖片的常用操作。相關(guān)API文檔:https://cloud.tencent.com/document/product/436/7751
1.申請騰訊云對象儲存,免費沒個月有10G流量,如果網(wǎng)站流量大,可付費購買
2.點擊創(chuàng)建存儲桶,如圖

image.png
3.創(chuàng)建注意事項,如圖

image.png
4.查找儲存桶秘鑰

image.png
5.獲取默認項目的秘鑰,不是總的秘鑰

image.png
6.如果需要不同尺寸的縮略圖則需要啟用騰訊云的數(shù)據(jù)萬象功能,如圖

image.png
7.注意騰訊云的圖像處理接口
download_url?imageView2/w/h/format/q/rq/lq
http://examples-1251000004.picsh.myqcloud.com/sample.jpeg?imageView2/1/w/400/h/600/q/85
http://examples-1251000004.picsh.myqcloud.com/sample.jpeg?imageView2/2/w/400/h/600/q/85!
http://examples-1251000004.picsh.myqcloud.com/sample.jpeg?imageView2/3/w/400/format/png
文檔官方說明
https://cloud.tencent.com/document/product/460/6929
8.網(wǎng)站本身配置(pos為列子)

image.png
圖片css js這些遠程儲存桶還是比較有意義的,比如我的服務(wù)器才1M帶寬,這種頁面加載圖片這些很慢,幾個人同時訪問更是慢,把圖片附件這些放cos的話,訪問快很多!
1.借助koa2建立的服務(wù)端項目
的app.js
//app.js
const Koa = require('koa')
const multer = require('koa-multer')
const Router = require('koa-router')
const views = require('koa-views')
const path = require('path')
const fs = require('fs')
const COS = require('cos-nodejs-sdk-v5')
const app = new Koa()
//加載模板引擎
app.use(views(path.join(__dirname, 'view'), {
extension: 'ejs'
}))
const router = new Router()
router.get('/', async (ctx, next) => {
let title = 'hello koa2'
await ctx.render('index', {
title
})
})
//文件上傳
//配置
var storage = multer.diskStorage({
//文件保存路徑
destination: function (req, file, cb) {
cb(null, 'public/uploads/')
},
//修改文件名稱
filename: function (req, file, cb) {
var fileFormat = (file.originalname).split("."); //以點分割成數(shù)組,數(shù)組的最后一項就是后綴名
cb(null, fileFormat[0] + "." + fileFormat[fileFormat.length - 1]);
}
})
//加載配置
var upload = multer({
storage: storage
});
var cos = new COS({
AppId: '1258336067',
SecretId: 'AKID89vfPu7CzhGzVVSnBKFySkvwkLkyAuc6',
SecretKey: 'SgfS1MSK4ZrwnPBhz70e3JLC0ay85nHW',
});
var tengxun_cos = {
Bucket: '564297479-1258336067',
Region: 'ap-hongkong',
}
//路由
router.post('/upload', upload.single('file'), async (ctx, next) => {
// 文件路徑
var filePath = ctx.req.file.path
// 文件類型
var temp = ctx.req.file.filename.split('.');
var fileType = temp[temp.length - 1];
var lastName = '.' + fileType;
// 構(gòu)建圖片名
var fileName = temp[0] + lastName;
//文件重命名 修改文件名稱,可更改文件的存放路徑。
fs.rename(filePath, fileName, (err) => {
if (err) {
console.log('文件寫入失敗')
} else {
console.log(fileName)
// let pathName = 'file-' + parseInt(1000000 * (Math.random() + 1)) + '/' + fileName // 隨機文件夾名以避免同名文件覆蓋
var localFile = './' + fileName;
var key = fileName;
// 騰訊云 文件上傳
var params = {
Bucket: tengxun_cos.Bucket,
/* 必須 */
Region: tengxun_cos.Region,
/* 必須 */
Key: key,
/* 必須 */
FilePath: localFile
}
cos.sliceUploadFile(params, function (err, data) {
if (err) {
ctx.body = {
status: '0',
msg: '上傳失敗',
error: JSON.stringify(err)
}
} else {
var imageSrc = `https://564297479-1258336067.cos.ap-hongkong.myqcloud.com/${data.Key}`
ctx.body = {
status: '1',
msg: '上傳成功',
imageUrl: imageSrc
}
console.log('上傳成功')
}
})
}
})
})
app.use(router.routes(), router.allowedMethods())
app.listen(5555, () => {
console.log('Server is running at port 5555...')
})

image.png
2.借助express的框架的服務(wù)端項目
//server.js
//node.js 作為服務(wù)器端
var express = require('express'); //引入框架
var app = express();
//靜態(tài)資源站
app.use(express.static('public'));
//__dirname 表示當(dāng)前的文件目錄下, 這個server.js文件在哪就代表在那個路徑
app.get('/index.html', function (req, res) {
res.sendFile(__dirname + '/' + 'index.html'); //注意dirname這個變量前面有兩個下劃線
});
app.get('/process_get', function (req, res) {
//輸出json格式
var response = {
'xuhengfeng1': req.query.first_name,
'xuhengfeng2': req.query.last_name
};
console.log(response);
res.end(JSON.stringify(response));
})
var fs = require('fs');
var COS = require('cos-nodejs-sdk-v5');
var cos = new COS({
AppId: '1258336067',
SecretId: 'AKID89vfPu7CzhGzVVSnBKFySkvwkLkyAuc6',
SecretKey: 'SgfS1MSK4ZrwnPBhz70e3JLC0ay85nHW',
});
var tengxun_cos = {
Bucket: '564297479-1258336067',
Region: 'ap-hongkong',
}
var multer = require('multer')
var upload = multer({
dest: './tmp/'
})
// 圖片上傳
app.all('/api/tengxun/upload2', upload.single('file'), function (req, res, next) {
// 文件路徑
var filePath = './' + req.file.path;
// 文件類型
var temp = req.file.originalname.split('.');
var fileType = temp[temp.length - 1];
var lastName = '.' + fileType;
// 構(gòu)建圖片名
var fileName = Date.now() + lastName;
// 圖片重命名
fs.rename(filePath, fileName, (err) => {
if (err) {
res.end(JSON.stringify({
status: '102',
msg: '文件寫入失敗'
}));
} else {
var localFile = './' + fileName;
var key = fileName;
// 騰訊云 文件上傳
var params = {
Bucket: tengxun_cos.Bucket,
/* 必須 */
Region: tengxun_cos.Region,
/* 必須 */
Key: key,
/* 必須 */
FilePath: localFile,
/* 必須 */
}
cos.sliceUploadFile(params, function (err, data) {
if (err) {
fs.unlinkSync(localFile);
res.end(JSON.stringify({
status: '101',
msg: '上傳失敗',
error: JSON.stringify(err)
}));
} else {
fs.unlinkSync(localFile);
var imageSrc = 'https://564297479-1258336067.cos.ap-hongkong.myqcloud.com/' + data.Key;
res.end(JSON.stringify({
status: '100',
msg: '上傳成功',
imageUrl: imageSrc
}));
}
});
}
});
})
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('應(yīng)用實例,訪問地址為http://%s:%s', host, port);
})
說白了借助node運行平臺以及express或者koa2的web服務(wù)器框架,寫前端的請求接口,提供前端去發(fā)起文件上下傳的請求