如何获取上传文件的文件路径以创建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的主要内容,如果未能解决你的问题,请参考以下文章