前言
之前做的《微信小程序开发(二)图片上传》和《Node.js+express+MySQL使用七牛云实现的用户头像修改》,使用的都是七牛云的对象云储存服务。这次公司使用另外一套系统,别人要求使用阿里云的服务,所以就研究一些阿里云的OSS,发现我的阿里云里面是有OSS的,所以就写了一些玩了一下。
使用步骤
新建bucket
首先登陆阿里云,进入控制台,对象存储OSS。
获取密匙
获取服务区域
这里给大家一个阿里云的链接访问域名和数据中心。
我的是华东2
后端代码实现
看文档
由于我的后端语言是Node.js,所以我看的是这个部分的:快速开始-NodeJS。
安装SDK
这里阿里云有案例的安装方式,这里我写的是我的方式。
1.去npm(https://www.npmjs.com/),网站搜索ali-oss;
2.在package.json
文件的dependencies
下添加"ali-oss": "^4.10.0"
;
3.cd
到项目目录下,执行npm install
;
4.由于SDK基于ES6开发,使用了Generator Function使得用户能够方便地用同步的方式异步的代码,需要配合co使用。具体可参考这篇博客。使用同步方式还需要安装co。这里方式同上。
代码实现
var express = require('express');
var router = express.Router();
var fs = require('fs');
// 初始化Client
var co = require('co');
var OSS = require('ali-oss');
var client = new OSS({
region: 'oss-cn-shanghai',
accessKeyId: 'L***************B',
accessKeySecret: 'I********************i'
});
var ali_oss = {
bucket: 'imagepath',
endPoint: 'oss-cn-shanghai.aliyuncs.com',
}
// 微信小程序 图片上传
var multer = require('multer')
var upload = multer({ dest: './tmp/' })
// 图片上传
router.all('/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;
// 构建图片名
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;
// 阿里云 上传文件
co(function* () {
client.useBucket(ali_oss.bucket);
var result = yield client.put(key, localFile);
var imageSrc = 'http://image.hgdqdev.cn/' + result.name;
// 上传之后删除本地文件
fs.unlinkSync(localFile);
res.end(JSON.stringify({status:'100',msg:'上传成功',imageUrl:imageSrc}));
}).catch(function (err) {
// 上传之后删除本地文件
fs.unlinkSync(localFile);
res.end(JSON.stringify({status:'101',msg:'上传失败',error:JSON.stringify(err)}));
});
}
});
})
module.exports = router;
上面的代码基本也展示了上传的流程。具体看代码即可。
前端测试
前端就写了一个最简单的form表单的上传。
<form action="upload2" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" />
</form>
这里大家可以直接使用我的接口测试。
扩展
在Ajax实现图片上传,这里做的是前端把图片转出base64数据,通过ajax上传。
后端代码实现
// 图片上传
router.post('/upload', function(req, res, next){
// 图片数据流
var imgData = req.body.imgData;
// 构建图片名
var fileName = Date.now() + '.png';
// 构建图片路径
var filePath = './tmp/' + fileName;
//过滤data:URL
var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = new Buffer(base64Data, 'base64');
fs.writeFile(filePath, dataBuffer, function(err) {
if(err){
res.end(JSON.stringify({status:'102',msg:'文件写入失败'}));
}else{
var localFile = filePath;
var key = fileName;
// 阿里云 上传文件
co(function* () {
client.useBucket(ali_oss.bucket);
var result = yield client.put(key, filePath);
var imageSrc = 'http://image.hgdqdev.cn/' + result.name;
res.end(JSON.stringify({status:'100',msg:'上传成功',imageUrl:imageSrc}));
}).catch(function (err) {
res.end(JSON.stringify({status:'101',msg:'上传失败',error:JSON.stringify(err)}));
});
// 上传之后删除本地文件
fs.unlinkSync(filePath);
}
});
})
域名管理
域名管理就是文件上传之后,不使用阿里的域名,使用自己的域名。
默认:http://imagepath.oss-cn-shanghai.aliyuncs.com/about1.png
修改后:http://image.hgdqdev.cn/about1.png
这样文件的外网地址就显示的是自己的域名了。
设置也很简单:
总结
阿里云的对象存储OSS功能还有很多,这里只是介绍图片上传。总的来说,使用之前要仔细看文档。