使用express和multer在node.js中创建文件夹时出错

问题描述 投票:0回答:1

我正在尝试使用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'
}
node.js express server multer
1个回答
0
投票

您在调用之前没有检查目录是否存在

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 方法正确,因为我是在手机上输入的。

© www.soinside.com 2019 - 2024. All rights reserved.