Express express -fileupload ENOENT: нет такого файла или каталога, откройте 'public / images / name.ext - PullRequest
0 голосов
/ 09 июля 2020

Я столкнулся с этой ошибкой ENOENT: нет такого файла или каталога, откройте 'public / images / name.ext из express -fileupload Я знаю, что есть много одинаковых проблем, но мне кажется, что решение не работайте с теми, которые я нашел здесь: Нет такой ошибки файла или каталога при загрузке файла с использованием Express -fileupload - Node.js

ни этот: ENOENT: нет такого файл или каталог.?

И я все еще получаю эту ошибку. Я не уверен, будет ли это объявление каталога publi c или mv ('спецификация каталога') или имя файла. Что-то определенно должно быть не так

Вот моя структура папок проекта: введите описание изображения здесь

и вот мое приложение. js файл

const express = require('express');
const cors = require('cors');
const fileUpload = require('express-fileupload')
const passport = require("passport");
const path = require("path");

const {db} = require("./database/db");
const authMiddleware = require('./app/middleware/authMiddleware')

const app = express();
// app.use(express.static(path.join(__dirname, "./public/")));
app.use(express.static(__dirname));
// app.use(express.static('public'))
// app.use('/public', express.static('public'));

// console.log('static path', express.static('public'))
app.use(fileUpload())


app.use('/api/asset/:assetId/uploadimage', async(req, res, next) => {
    const file = req.files.file;
    console.log('files bs',file)
    try{
        if(file === null){
            throw new Error('Not file Specified')
        }
        // await file.mv(path.join(__dirname, `public/images/${file.name}`))
        // await file.mv('public/image/' + file.name)

        await file.mv('public/images/' + file.name)

        res.status(200).json({fileName: file.name, filePath: `/uploads/${file.name}`});
    }
    catch(err){
        console.log(err)
        return res.status(400).send(err.message);
    }
})

Вы можете увидеть закомментированный код, это способы, которые я тоже пробовал, но они не сработали: (

и вот ошибка:

node_1   | files bs {
node_1   |   name: '20191009_122021.jpg',
node_1   |   data: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 48 00 48 00 00 ff e1 02 8a 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 09 01 0f 00 02 00 00 00 08 00 00 ... 1488306 more bytes>,
node_1   |   size: 1488356,
node_1   |   encoding: '7bit',
node_1   |   tempFilePath: '',
node_1   |   truncated: false,
node_1   |   mimetype: 'image/jpeg',
node_1   |   md5: 'd2855d664bd5e5565a45da1ae06bd1ee',
node_1   |   mv: [Function: mv]
node_1   | }
node_1   | [Error: ENOENT: no such file or directory, open 'public/images/20191009_122021.jpg'] {
node_1   |   errno: -2,
node_1   |   code: 'ENOENT',
node_1   |   syscall: 'open',
node_1   |   path: 'public/images/20191009_122021.jpg'
node_1   | }

Пожалуйста, помогите :)

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

ОБНОВЛЕНИЕ ДЛЯ ТЕХ, У КОГО ИМЕЕТ ФУНКЦИЮ ЗАГРУЗКИ НЕ В ИНДЕКСЕ. JS ФАЙЛ ДЛЯ ПРИМЕРА IN / APP_NAME / ROUTES ИЛИ /APP_NAME/SERVER/SRC/ROUTE/ROUTE.JS (версия mern_stack)

Итак, в моем случае я сделал функцию загрузки в папке /app/controllers/

Структура расположения файла моего контроллера:

/my_app_name/server/src/app/controllers/FileUploader.js

Мой root расположение файла сервера / индекса:

/my_app_name/server/src/app.js

, чтобы указать местоположение для общедоступных / изображений, где я хочу хранить свои изображения:

/my_app_name/server/src/public/images

в /my_app_name/server/src/app/controllers/FileUploader.js Мне пришлось использовать require('path')

и вот как это выглядит:

const path = require("path");

const addImages = async(req, res, next) => {
    const file = req.files.file;
    console.log('files',file)
    try{
        if(file === null){
            throw new Error('Not file Specified')
        }
        await file.mv(path.join(path.dirname('/app/server/src/'), '/src/public/images/') + file.name)

        res.status(200).json({fileName: file.name, filePath: `/public/images/${file.name}`});
    }
    catch(err){
        console.log(err)
        return res.status(400).send(err.message);
    }
}

объяснение причины, по которой мне пришлось использовать path.join() и path.dirname()

в основном я не мог использовать (path.join(__dirname, "./public/images")) или __dirname в общем, так как он выдаст мне путь, где находится мой FileUploader. js is, который равен /my_app_name/server/src/app/controllers/, а затем, если бы я добавил "./public/images", он бы посмотрел на /my_app_name/server/src/app/controllers/public/images Поэтому нам нужно указать path.dirname() где находится ваша папка узла root, в моем случае это будет path.dirname('/app/server/src/'), так как у меня такой неаккуратный стек MERN tructure с docker

, а остальным вам просто нужно присоединить свое имя к своему общедоступному / местоположению изображений, которое составляет path.join(path.dirname('/app/server/src/'), '/src/public/images/')

, так что все вместе это должно быть await file.mv(path.join(path.dirname('/app/server/src/'), '/src/public/images/') + file.name) (ЕСЛИ ВЫ ИМЕЙТЕ ТАКУЮ СТРУКТУРУ СТЕКА SLOPPPY MERN, КАК МЕНЯ :))

Надеюсь, это кому-то поможет! Удачного выродка! :)

0 голосов
/ 09 июля 2020

Обновление от себя. Мне удалось решить проблему.

Похоже, узлу не нравится этот синтаксис указания пути с этим символом с серьезным ударением, поэтому он выдавал мне ошибку. Итак, для тех, кто все еще борется, попробуйте указать такой путь.

await file.mv(path.join(__dirname, 'public/images/') + file.name)

ОБНОВЛЕНИЕ: убедитесь, что указанный путь указан в вашей папке publi c. чтобы уточнить, вам нужно создать первый каталог your_project_name / public / images /

в моем случае это было

mern
 -server
   -src
     -public
       -images

     app.js

  serve.package.json
 -client
  -src
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...