今天要來學習和文件相關的功能
1.文件上傳的基礎
2.文件驗證與限制
3.存儲文件
npm install multer
2.配置Multer:
範例:
const multer = require('multer');
// 設置存儲方式,文件將保存到 'uploads/' 文件夾
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/');
},
filename: (req, file, cb) => {
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, file.fieldname + '-' + uniqueSuffix);
}
});
const upload = multer({ storage: storage });
// 創建文件上傳路由
app.post('/upload', upload.single('file'), (req, res) => {
// 'file' 是表單中的文件字段名稱
res.send('File uploaded successfully');
});
這段程式碼會將上傳的文件保存到伺服器的 uploads 目錄中,並給文件生成一個唯一名稱來避免文件名衝突。
1.多文件上傳:
範例:
app.post('/upload-multiple', upload.array('files', 5), (req, res) => {
// 'files' 是表單中的文件字段名稱,允許最多上傳 5 個文件
res.send('Files uploaded successfully');
});
為了保證應用的安全性和性能,應該限制文件的大小並驗證文件類型。Multer 提供了方便的選項來設定這些限制。
1.文件大小限制:
範例:限制文件大小為 2MB
const uploadWithSizeLimit = multer({
storage: storage,
limits: { fileSize: 2 * 1024 * 1024 } // 2MB
});
2.驗證文件類型:
範例:只允許上傳圖片文件(jpg、png)
const uploadWithFileFilter = multer({
storage: storage,
fileFilter: (req, file, cb) => {
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
cb(null, true);
} else {
cb(new Error('Only .jpg and .png files are allowed!'));
}
}
});
在某些情況下,可能需要將上傳的文件存儲到雲端服務(如 AWS S3),而不是本地伺服器。這樣可以提高可擴展性和文件管理的靈活性。
1.安裝AWS SDK
npm install aws-sdk multer-s3
2.將文件上傳到 AWS S3
範例:
const aws = require('aws-sdk');
const multerS3 = require('multer-s3');
// 配置 AWS S3
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: 'us-east-1'
});
const s3 = new aws.S3();
const uploadToS3 = multer({
storage: multerS3({
s3: s3,
bucket: 'my-bucket-name',
key: (req, file, cb) => {
cb(null, Date.now().toString() + '-' + file.originalname);
}
})
});
app.post('/upload-to-s3', uploadToS3.single('file'), (req, res) => {
res.send('File uploaded to S3 successfully');
});
這段代碼會將文件上傳到 AWS S3 的指定存儲桶中,並生成唯一的文件名稱。
除了上傳文件,你還可能需要對文件進行其他操作,如:
const fs = require('fs');
app.delete('/delete-file/:filename', (req, res) => {
const filePath = `uploads/${req.params.filename}`;
fs.unlink(filePath, (err) => {
if (err) {
return res.status(500).send('File deletion failed');
}
res.send('File deleted successfully');
});
});