最近玩node的时候发现需要文件上传功能,于是研究了一下,最开始也是千难万难,不过最终还是有了成果
首先要下载 multer、ali-oss、co 这三个包
npm i multer -S或者cnpm i multer -S
npm i ali-oss -S或者cnpm i ali-oss -S
npm i co -S或者cnpm i co -S
然后就是引入部分
const multer = require('multer'); // multer是一个node.js文件上传中间件,有了他才能读取到文件
let co = require('co'); // co 模块,它基于 ES6 的 generator 和 yield ,让我们能用同步的形式编写异步代码。
let OSS = require('ali-oss'); // oss上传所需模块
let fs = require('fs'); // fs可以对文件进行操作
let client = new OSS({ // 链接oss 这里面的配置最好是放在单独的文件,引入如果要上传的git的话账号密码最好不要传到git
region: 'oss-cn-hangzhou', // oss地区,只需要把 hangzhou 改为相应地区即可,可以在oss上随便找一个文件链接就知道是哪个地区的了
accessKeyId: 'xxxx', // oss秘钥
accessKeySecret: 'xxx', // oss秘钥的密码
bucket: 'ganziwen', // 存储库名称
});
const endPoint = 'ganziwen.oss-cn-hangzhou.aliyuncs.com', // 自己的oss链接名,可以在oss上随便找一个文件链接就知道了
const bucket = 'ganziwen';
let upload = multer({ // 不太清楚这是什么,但是必须有这一段
storage: multer.diskStorage({
destination: function(req, file, cb) {
cb(null, './public/uploads'); // 必须在上一级有public文件夹,public文件夹内也必须有uploads,当然,文件夹的名称可以随便修改,只需要写对就可以了
},
filename: function(req, file, cb) {
var changedName = new Date().toISOString().replace(/:/g, '-') + '-' + file.originalname;
cb(null, changedName);
}
})
});
// 接下来就是接口部分了
// 如果你发现接口里面什么都没写报错500,多半是upload内的东西出问题了,最有可能的是文件夹,和前端传输文件的问题
router.post('/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;
// 图片重命名
var key = fileName;
// 阿里云 上传文件
co(function*() {
client.useBucket(bucket);
var result = yield client.put('/images/'+key, filePath); // 这是上传的代码
var imageSrc = `http://${endPoint}/` + result.name;
// 上传之后删除本地文件
fs.unlinkSync(filePath);
res.end(JSON.stringify({ code: 1, msg: '上传成功', path: imageSrc }));
}).catch(function(err) {
// 上传之后删除本地文件
// 如果你发现上传失败了,多检查一下配置参数是否有问题,参数出问题的可能性比较大
fs.unlinkSync(filePath);
res.end(JSON.stringify({ code: 0, msg: '上传失败', error: JSON.stringify(err) }));
});
});
javascript```
以上就是后端上传文件的部分了,我这里主要上传的是图片,其他文件还未测试
前端部分
```javascript
let formData = new FormData();
// 这个file要和后端规定的参数名一样
formData.append('file', 文件);
// 还可以携带一些其他参数
formData.append('xxx', xxx);
// 我使用的是axios发送请求
axios.post("请求的路径",formData,{
headers: {'Content-Type': 'multipart/form-data'}
}).then(res => {
console.log(res);
});
javascript```
如果node部分和我得一样,那么前端传输的必须是文件流,不能是base64
以上就是node传输文件到阿里云oss的例子了,如有错误,还请指正