如何获取上传文件的文件路径以创建ReadStream

Posted

技术标签:

【中文标题】如何获取上传文件的文件路径以创建ReadStream【英文标题】:How to get filepath of uploaded file to createReadStream 【发布时间】:2019-06-15 05:43:24 【问题描述】:

我正在使用 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】:

看起来你正在 nodejs 上编写一个 express 应用程序。您的问题在这里:

const readStream = fs.createReadStream(filePath);

我认为您认为这是您“读取”用户正在上传的文件的方式,但这实际上是不可能的 - 浏览器中不存在“fs”模块。浏览您网站的用户正在通过表单从他们的计算机上传图片,这意味着图片来自 HTTP 请求(req 对象),而不是来自文件系统。

(这可能会令人困惑,因为在您的情况下,您可能在本地计算机上运行此快速应用程序,但在生产中更容易想象它 - 快速应用程序在某处的大型服务器上运行,并且是不同的计算机您用户的计算机,正在上传的文件所在的位置。)

查看相关的 S.O.问题How to upload, display and save images using node.js and express。另请参阅教程Upload Files or Images to Server using Nodejs。

【讨论】:

以上是关于如何获取上传文件的文件路径以创建ReadStream的主要内容,如果未能解决你的问题,请参考以下文章

如何获取file 文件上传是的参数

如何使用Javascript从文件上传中获取完整路径

js关于图片上传路径的获取

我该如何获取ant-d中上传文件的文件路径?

如何在codeigniter中获取上传文件的完整路径?

在firefox中以html上传文件时获取文件完整路径[重复]