# **将文件保存在后端项目本地**
eg. 将头像文件保存到本地 `public/uploads/avatar` 文件夹下
## **插件 `multer`**
## **安装并使用**
#### **安装**
```
npm install multer --save
```
#### **引用**
```
const multer = require("multer");
const upload = multer({ dest: "public/uploads/avatar/" });// 项目重启之后会在指定dest指定的路径下创建对应的文件夹
```
#### **自定义文件存储名称**
```
const storage = multer.diskStorage({
destination: 'uploads/', // 文件存储路径
filename: (req, file, cb) => { // 重命名文件函数
// 生成带有.jpg后缀的文件名
const fileName = file.fieldname + '-' + Date.now() + '.jpg';
cb(null, fileName);
}
});
```
#### **使用**
```
// 示例
router.post(
"/admin/user/update", // 前端调用上传时的接口地址
upload.single("file"), // 前端负载中的formdata中的文件二进制对应的key
UserController.updateUserInfo
); // 更新用户信息
```
#### **controller 中获取到保存的file信息**
```
updateUserInfo: async (req, res) => {
...
// 通过 req.file 获取到file信息
/*
{
fieldname: 'file', // 字段
originalname: 'bg_userportrait.png', // 文件原始名称
encoding: '7bit', // 编码
mimetype: 'image/png', // 文件类型
destination: 'public/uploads/avatar/', // 文件存储文件夹路径
filename: '23a778bd9d379ca6987cf8890351cf1f', // 存储后的文件名
path: 'public\\uploads\\avatar\\23a778bd9d379ca6987cf8890351cf1f',// 文件存储完整地址
size: 43067 // 文件大小
}
*/
...
}
```
# **实现文件上传到七牛云**
## **安装依赖**
```
npm/cnpm install qiniu
```
or
```
yarn add qiniu
```
## **导出七牛云配置文件的Token**
```
// 七牛云配置文件
const qiniu = require('qiniu');
// 创建上传凭证(accessKey 和 secretKey在七牛云个人中心中有,blog 是七牛云创建的空间名称)
const accessKey = 'xxxxxxx'; // ak密钥
const secretKey = 'xxxx'; // sk密钥
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const options = {
scope: 'blog' // 存储空间的名字
};
const putPolicy = new qiniu.rs.PutPolicy(options);
const uploadToken = putPolicy.uploadToken(mac);
module.exports = {
uploadToken // 导出的是七牛云生成的token
};
```
## **提供接口给前端使用**
```
// 前端获取到七牛云返回的token
const express = require('express');
// 定义路由级中间件
const router = express.Router();
const uploadToken = require('./qiniu')
router.get('/getQiniuToken', (req, res) => {
res.json({
code: 200,
data: uploadToken.uploadToken,
messages: '获取成功'
});
});
module.exports = router;
```
# **实现文件上传到MinIO**
## **安装依赖**
```
npm install minio --save
```
## **引用依赖**
```
const Minio = require('minio');
```
## **配置minio**
```
const minioClient = new Minio.Client({
endPoint: 'minio.example.com',
port: 9000,
useSSL: true,
accessKey: 'YOUR-ACCESSKEYID',
secretKey: 'YOUR-SECRETACCESSKEY',
});
```
## **实现接口**
```
app.post('/upload', (req, res) => {
if (!req.files) {
res.status(400).send('No file uploaded');
} else {
const file = req.files.file;
const metaData = {
'Content-Type': file.mimetype,
};
const stream = Buffer.from(file.data, 'binary');
minioClient.putObject(
'my-bucket',
file.name,
stream,
stream.length,
metaData,
(err, etag) => {
if (err) return console.log(err);
console.log(etag);
res.status(200).send('File uploaded');
},
);
}
});
```
# **实现本地批量上传文件到AliYunOSS**
## **安装依赖**
```
npm install ali-oss --save
```
## **使用**
#### **创建oss.js**
```
const OSS = require('ali-oss');
async function uploadFileToOSS(file) {
// 配置你的OSS信息
const client = new OSS({
region: '<Your region>',
accessKeyId: '<Your accessKeyId>',
accessKeySecret: '<Your accessKeySecret>',
bucket: '<Your bucket name>',
});
// 假设file是一个包含文件信息的对象,例如从Express.js的req.file获取
// file.name是文件名,file.path是文件的本地路径
try {
const result = await client.put(file.name, file.path);
console.log('File uploaded to OSS:', result);
return result;
} catch (e) {
console.error('Error uploading file to OSS:', e);
return e;
}
}
```
#### **使用示例**
```
// 假设file是你前端传来的文件对象,它可能包含name和path属性
uploadFileToOSS(file).then(result => {
console.log('上传结果:', result);
}).catch(error => {
console.error('上传失败:', error);
});
```