我正在尝试使用express和multer用node.js做一个服务器,我可以在其中发送一个标识符和12张照片以存储在一个文件夹中。我正在使用多部分表单数据,但在动态创建目录时遇到问题。
接收服务器的标识符将是最后创建的文件夹,以及何时存储照片。
我的服务器中有下一个文件夹:
/Users/vmartin/SourceCode/CerambyxApi/httpdocs/cerambyx_data/received/
/Users/vmartin/SourceCode/CerambyxApi/httpdocs/cerambyx_data/only_segmented/
然后,当我收到请求时,我需要使用发送的标识符在存储文件之前创建一个文件夹,例如:
identifier: 7ee1a048-f81f-4a
需要创建服务器
"/Users/vmartin/SourceCode/CerambyxApi/httpdocs/cerambyx_data/received/7ee1a048-f81f-4a/"
但是我在邮递员测试时遇到错误。
这是我的控制器代码。
const express = require('express');
const multer = require('multer');
const fs = require('fs');
const path = require('path');
const router = express.Router();
const { uploadCollection } = require('../controllers/controller_upload_collection');
const destinationPath = path.join(__dirname, '..', 'cerambyx_data', 'received');
// Configuración de Multer para subida de archivos
const storage = multer.diskStorage({
destination: async function (req, file, cb) {
const identifier = req.body.identifier;
const receivedDir = path.join(destinationPath, identifier); // Ruta completa
try {
// Verificar si la carpeta de destino existe
const destinationStats = await fs.promises.stat(destinationPath);
// Si no existe, intentar crearla
if (!destinationStats.isDirectory()) {
await fs.promises.mkdir(destinationPath, { recursive: true });
console.log('Carpeta base de destino creada:', destinationPath);
}
// Verificar si la subcarpeta específica existe
const receivedStats = await fs.promises.stat(receivedDir);
// Si no existe, intentar crearla
if (!receivedStats.isDirectory()) {
await fs.promises.mkdir(receivedDir, { recursive: true });
console.log('Subcarpeta específica de destino creada:', receivedDir);
}
// Llamar al callback de Multer con la ruta completa
cb(null, receivedDir);
} catch (error) {
console.error('Error al verificar o crear la carpeta de destino:', error);
cb(error); // Llamar al callback con el error
}
},
filename: function (req, file, cb) {
cb(null, file.originalname);
}
});
const upload = multer({
storage: storage,
limits: { fileSize: 30 * 1024 * 1024 }, // 30MB por archivo
fileFilter: function (req, file, cb) {
// Aquí puedes agregar lógica de filtrado si es necesario
cb(null, true);
}
});
// Ruta para subir fotos
router.post('/', upload.array('photos', 12), uploadCollection);
module.exports = { uploadCollectionRouter: router };
node.js返回的错误是:
Error al verificar o crear la carpeta de destino: [Error: ENOENT: no such file or directory, stat '/Users/vmartin/SourceCode/CerambyxApi/httpdocs/cerambyx_data/received/7ee1a048-f81f-4a'] {
errno: -2,
code: 'ENOENT',
syscall: 'stat',
path: '/Users/vmartin/SourceCode/CerambyxApi/httpdocs/cerambyx_data/received/7ee1a048-f81f-4a'
}
您在调用之前没有检查目录是否存在
const destinationStats = await fs.promises.stat(destinationPath);
要解决此问题,首先检查目录是否存在,如果不存在,则递归创建它,以便父目录也会自动创建。你可以这样做:
const directoryExists = await fs.promises.exists(destinationPath);
if (!directoryExists) {
await fs.promises.mkdir(destinationPath, { recursive: true}):
}
请确认 fs.promises.exists 方法正确,因为我是在手机上输入的。