node+express 实现阿里云OSS图片上传
由于SDK基于ES6开发,使用了Generator Function使得用户能够方便地用同步的方式异步的代码,需要配合co使用。具体可参考这篇博客。使用同步方式还需要安装co。这里方式同上。
// 初始化Client
var co = require('co');
var OSS = require('ali-oss');
var client = new OSS({
region: 'oss-cn-shanghai',
accessKeyId: '<Your AccessKeyId>',
accessKeySecret: '<Your AccessKeySecret>',
bucket: '<Your bucket name>'
});
var ali_oss = {
bucket: '<Your bucket name>',
endPoint: 'oss-cn-shanghai.aliyuncs.com',
}
router.post('/addimgfile', function(req, res, next){
// console.log(req.body.imgfiles);
// 图片数据流
var imgData = req.body.imgfiles;
// 构建图片名
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://images-funcode.oss-cn-beijing.aliyuncs.com/' + result.name;
// 上传之后删除本地文件
fs.unlinkSync(filePath);
res.end(JSON.stringify({status:'100',msg:'上传成功',imageUrl:imageSrc}));
}).catch(function (err) {
res.end(JSON.stringify({status:'101',msg:'上传失败',error:JSON.stringify(err)}));
});
}
});
});