Как получить путь к файлу загруженного файла для createReadStream - PullRequest
0 голосов
/ 21 января 2019

Я использую Nodejs readStream.pipe (writeStream).Как я могу получить полный путь к файлу, который я загружаю, и назначить его для createReadStream.Я получаю только имя файла, и когда файл находится в корневом каталоге nodejs, ничего страшного нет, но когда я загружаюсь из любого другого места, я получаю ошибку:

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: ENOENT: no such file or directory, open 'C:\Users\Esen\Documents\GitHub\gbmsturbo\nike.png'

Я знаю, что это происходит, потому что nike.png, что язагружаю не в "C: \ Users \ Esen \ Documents \ GitHub \ gbmsturbo \".Он находится внутри этой папки: "C: \ Users \ Esen \ Documents \ GitHub \ filestoupload"

Я попытался

function throwErrorDontCrash() {
   process.on('uncaughtException', function (err) {
      console.error(err.message)
   })
}

, и это предотвращает сбой nodejs и загружает файл, но с пустым содержимым(0 байт)

router.post('/upload', (req, res) => {

    var filePath = req.body.file
    var ext = path.extname(filePath)
    var filename = path.basename(filePath, ext)

    var newVerFilePath = "public/uploads/" + newVerFileName+ext

    const readStream = fs.createReadStream(filePath)
    throwErrorDontCrash()
    const writeStream = fs.createWriteStream(newVerFilePath)
    readStream.pipe(writeStream)


function throwErrorDontCrash() {
  process.on('uncaughtException', function (err) {
    //console.error(err.message)
  })
}

и вот мой файл формы

<form class="center" action="/upload" method="post">
<input id="file" type="file" name="file" required encrypt="multipart/form-data"/>
<input type="submit" value="UPLOAD">

Я хочу, чтобы filePath включал путь к каталогу, куда бы ни загружался файл, когда пользователь нажимает кнопку Выбрать или Обзор,В настоящее время filePath получает только имя файла, такое как nike.png, и я ожидаю получить «C: /Users/Esen/Documents/GitHub/filestoupload/nike.png»

1 Ответ

0 голосов
/ 21 января 2019

похоже, что вы пишете экспресс-приложение на nodejs. Ваша проблема здесь:

const readStream = fs.createReadStream(filePath);

Я думаю, что вы считаете, что именно так вы «читаете» файл, загружаемый пользователем, но на самом деле это невозможно - модуль «fs» не существует в браузере. Пользователь, перемещающийся по вашему веб-сайту, загружает изображение со своего компьютера через форму, что означает, что изображение поступает из HTTP-запроса (объект req), а не из файловой системы.

(Это может сбивать с толку, потому что в вашем случае вы, вероятно, запускаете это экспресс-приложение локально на своей машине, но проще представить его в производственном процессе - экспресс-приложение работает где-то на большом сервере и отличается от компьютера, чем компьютер вашего пользователя, на котором находится загружаемый файл.)

Проверьте связанные S.O. вопрос Как загружать, отображать и сохранять изображения, используя node.js и экспресс . Также см. Учебник Загрузка файлов или изображений на сервер с использованием Nodejs .

...