nodejs上传文件到阿里云oss

4,970 阅读3分钟

最近玩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的例子了,如有错误,还请指正