我有一個銷售汽車的應用程式,我想將每個汽車影像上傳到此路徑內的單獨檔案夾country/city。
例如:
假設在德國柏林有一輛車。添加這輛車時,我將影像保存到此檔案夾Germany/Berlin。
現在我不想將德國柏林的所有汽車影像放在同一個檔案夾中,我想為德國柏林的每輛汽車制作一個單獨的檔案夾。
我的第一種方法是計算基本路徑中的檔案夾數量,然后通過在數字上加一個來創建一個新檔案夾。
例如:
假設有 5 個檔案夾,Germany/Berlin其中是我們示例的基本路徑
路徑現在將是這樣的“德國/柏林/6”。問題是它為每個影像創建了一個不同的檔案夾。
例如:
假設里面有 5 個檔案夾Germany/Berlin,上傳的汽車有 4 張圖片。
第一個影像進入里面Germany/Berlin/6。
第二個影像進入里面Germany/Berlin/7。
第三張圖片進入里面Germany/Berlin/8。
第四個影像進入里面Germany/Berlin/9。
我認為問題在于正在為每個影像執行目標函式。
我該如何解決這個問題?
這是我的代碼:
const multer = require("multer");
const path = require("path");
const fs = require("fs");
const { onlyImagesAreAllowed } = require("./error_codes");
function uploadFiles(filePath) {
const storage = multer.diskStorage({
destination: (req, _file, cb) => {
const data = req.body;
let dirsCount = 1;
let dirPath = `images/${filePath}/${data.country}/${data.city}`;
const exists = fs.existsSync(dirPath);
if (!exists) {
fs.mkdirSync(dirPath, { recursive: true });
}
if (exists) {
dirsCount =
fs
.readdirSync(dirPath, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name).length 1;
}
dirPath = `${dirsCount}`;
fs.mkdirSync(dirPath, { recursive: true });
cb(null, dirPath);
},
filename: (_req, file, cb) => {
const uniqueSuffix = Date.now() "-" Math.round(Math.random() * 1e9);
cb(null, file.fieldname "-" uniqueSuffix);
},
});
const fileFilter = (req, file, callback) => {
const acceptedTypes = file.mimetype.split("/");
if (acceptedTypes[0] === "image") {
callback(null, true);
} else {
callback(null, false);
callback(new Error(onlyImagesAreAllowed));
}
};
const limits = {
fileSize: 20 * 1024 * 1024,
};
return multer({
storage: storage,
fileFilter: fileFilter,
limits: limits,
});
}
module.exports = {
uploadFiles,
};
用法是這樣的:
const express = require("express");
const carsController = require("./cars.controller");
const { uploadFiles } = require("../../utils/upload_files");
const router = express.Router();
router.post(
"/addCar",
uploadFiles("cars").array("carGallery", 12),
carController.addCar
);
module.exports = router;
uj5u.com熱心網友回復:
如果req每個影像檔案都相同(我假設它是),您可以向它添加一個包含目錄的自定義屬性。如果該屬性不存在,請運行您的邏輯以確定下一個目錄名稱;如果確實存在,請重用它。
像這樣的東西:
destination: (req, _file, cb) => {
// check if we already determine an upload path for this request
if (req._upload_path) {
return cb(null, req._upload_path);
}
// no, we didn't, so determine the next upload path
const data = req.body;
let dirsCount = 1;
...
[the rest of your logic]
...
fs.mkdirSync(dirPath, { recursive: true });
// store the upload path we just determined
req._upload_path = dirPath;
cb(null, dirPath);
},
順便說一句:如果您真的不需要連續編號的目錄,我建議您使用唯一的 id(類似于 UUID)代替(它會更快并且更不容易出現競爭條件)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/506265.html
標籤:javascript 节点.js 表示 穆尔特
