【发布时间】:2021-07-18 23:29:40
【问题描述】:
我目前正在使用 Multer 这样做,但我不确定最佳做法是什么。
文件保存在files 文件夹中,命名约定如下:uid-filename
例如。 pdMNjRYIJTn9vw84tPCF-some_file_name.jpg.
使用 UID 的原因是允许保存具有相同名称的文件。下载的文件名称中没有 UID。
这是一个好方法吗?有什么可以改进的?
表格
| id | recordId | originalName | uid | fileName | extension | path | size | userId | created |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 6 | some_file_name.jpg | pdMNjRYIJTn9vw84tPCF | pdMNjRYIJTn9vw84tPCF-some_file_name.jpg | jpg | /uploads/pdMNjRYIJTn9vw84tPCF-some_file_name.jpg | 76463 | 1 | 2021-04-25 11:53:17 |
客户
async function uploadFile(file) {
let formData = new FormData();
formData.append("file", file);
formData.append("recordUid", recordUid);
let res = await fetchPostFile("/api/files", formData);
}
服务器
const storage = multer.diskStorage({
destination: filesFolderPath,
filename: (req, file, cb) => {
let uid = generateUid();
cb(null, `${uid}-${file.originalName}`);
},
});
const upload = multer({
storage: storage,
limits: { fileSize: 1024 * 1024 * 10 }, // 10 mb
});
router.post("/api/files", upload.single("file"), async (req, res, next) => {
try {
let { recordUid } = req.body;
let { originalName, filename, path, size } = req.file;
let parts = originalName.split(".");
let extension = parts[parts.length - 1];
let uid = filename.substring(0, 20);
let query = `
insert into file
(
recordId,
originalName,
uid,
fileName,
extension,
path,
size,
userId,
created
)
values
(
(select id from record where uid = ?),
?,
?,
?,
?,
?,
?,
?,
now()
);
`;
let rows = await req.asyncQuery(query, [recordUid, originalName, uid, filename, extension, path, size, req.userId]);
res.status(200).send({ success: true });
} catch (err) {
next(err);
} finally {
req.connection.release();
}
});
【问题讨论】:
标签: javascript mysql linux filesystems multer