Загрузка директории с файлами через multer на сервер

Подскажите, есть ли возможность загружать папку с файлами на сервер через multer, при этом сохранив всю структуру папок и файлов в них? В документации подобного нет. Пытался передавать директорию через req.body, но это не вышло. Код на клиенте:

const UploadFilse = () => {
    const [files, setFiles] = useState(null);

    const onSubmit = async (e) => {
        e.preventDefault();
        
        const appendFormData = (files) => {
            const data = new FormData();

            for (let i in Array.from(files)) {
                data.append("dirPath", files[i].webkitRelativePath);
                data.append("files", files[i]);
            }

            return data;
        };

        const data = appendFormData(files);

        await axios.post("http://localhost:5070/test", data, {
            headers: {
                "content-type": "multipart/form-data",
            },
        });

    };

    return (
        <div className="container">
            <form onSubmit={(e) => onSubmit(e)}>
                <input onChange={(e) => setFiles(e.target.files)} type="file" directory="" webkitdirectory="" mozdirectory=""/>
                <button type="submit">Отправить</button>
            </form>
        </div>
    );
};

Код на сервере:

const storage = multer.diskStorage ({
    destination: function (req, file, cb) {

        console.log(req.body.dirPath)
        console.log(file)

        // fs.mkdirSync(req.body.dirPath, { recursive: true })

        // cb(null, `${__dirname}/uploads/${req.body.dirPath}`)

    },
    filename: function (req, file, cb) {
        cb(null, file.originalname + '-' + Date.now())
    }
})

Вывод в консоли:

course name/Chapter 3/expressjs.png
{
  fieldname: 'files',
  originalname: 'expressjs.png',
  encoding: '7bit',
  mimetype: 'application/octet-stream'
}
[
  'course name/Chapter 3/expressjs.png',
  'course name/Chapter 3/mongo.png'
]
{
  fieldname: 'files',
  originalname: 'mongo.png',
  encoding: '7bit',
  mimetype: 'image/png'
}
[
  'course name/Chapter 3/expressjs.png',
  'course name/Chapter 3/mongo.png',
  'course name/Chapter 2/next.jpg'
]
{
  fieldname: 'files',
  originalname: 'next.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg'
}
[
  'course name/Chapter 3/expressjs.png',
  'course name/Chapter 3/mongo.png',
  'course name/Chapter 2/next.jpg',
  'course name/Chapter 1/react.png'
]
{
  fieldname: 'files',
  originalname: 'react.png',
  encoding: '7bit',
  mimetype: 'image/png'
}

Если добавить fs.mkdirSync(req.body.dirPath, { recursive: true }) то будет ошибка (path должен быть строкой). А как видно из консоли, данные приходят сначала строка, потом это массив. Попытка пройтись циклом по массиву тоже не дало нужных результатов. Т.к. цикл срабатывает для каждого массива. Подскажите, можно решить задачу "Загрузка директории с файлами на сервер" с помощью multer или возможно есть стандартные метода загрузки файлов через nodejs или expressjs? (express-fileupload уже пробовал...)


Ответы (0 шт):