# **將文件保存在后端項目本地**
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);
});
```