不使用框架进行纯Node.js文件上传(multipart POST)

16

第三方库"node-formidable"和"express"自带处理multipart POST请求的能力(例如使用上传文件表单),但我不想使用任何第三方代码。如何在纯JavaScript和Node.js中实现文件上传过程?

关于此方面的资源非常少。这该如何实现?谢谢,爱了。


这里也有同样的问题。怎么做呢? - devdropper87
3个回答

11

为了澄清一下,因为似乎有些人对另一个答案不太满意: 没有简单的方法可以在不依靠库的情况下完成此操作。

首先,这里有一个回答另一个问题的答案,试图澄清关于 POST 文件上传发生的事情:https://dev59.com/Jmoy5IYBdhLWcg3wQ8AF#8660740

总之,要解析这样的上传,您首先需要检查是否存在包含“multipart/form-data”字符串的 Content-Type 标头,如果存在,则读取标头中的 boundary 属性。

之后,内容以多个部分传入,每个部分都以边界字符串开头,包括一些附加标头,然后是空行后的数据本身。浏览器可以自由选择边界字符串,只要这样的字节序列不存在于上传的数据中(详情请参见规范:https://www.rfc-editor.org/rfc/rfc1867)。 您可以通过为请求对象的数据事件注册回调函数来读取数据:request.on('data', callback);

例如,使用边界 “QweRTy”,上传可能如下所示:

POST /upload HTTP/1.1
(some standard HTTP headers)
Content-Type: multipart/form-data; boundary=QweRTy

--QweRTy
Content-Disposition: form-data; name="upload"; filename="my_file.txt"
Content-Type: text/plain

(The contents of the file)
--QweRTy--

请注意,在初始标头之后,每个边界字符串的开头都会添加两个破折号,并且在最后一个标头之后也会添加两个破折号。

现在,这让问题变得具有挑战性的是,您可能需要在几个块中读取传入数据(在上面提到的回调函数中),并且不能保证边界将被包含在一个块内。所以您要么需要缓冲所有数据(不一定是个好主意),要么实现一个状态机解析器,逐字节地查看数据。 这实际上正是formidable库正在做的事情

所以,在考虑类似的问题后,我个人决定使用该库。重新实现这样的解析器容易出错,而且我认为不值得这样做。但是如果您确实想避免使用任何库,则检查formidable的代码可能是一个很好的开始。


4

0

如果您不想使用任何模块,我认为您需要自己解析表单。上传文件时,表单将以 multipart/form-data 格式出现,这意味着您的请求内容将被您的浏览器随机生成的字符串分割。您需要在表单开头读取此字符串,尝试加载数据并找到此字符串,然后逐个解析它们。

有关 multipart/form-data 的更多信息,请参考 http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

我认为最好的解决方案是使用 formidable。它可以处理各种情况,并且我认为它非常完美。


如果我的理解是正确的,那么你可以在Chrome中打开开发者工具并激活网络选项卡来读取表单内容。在Windows中,你也可以使用Fiddler。 - Shaun Xu
1
一个回答说“你应该做你不想做的事情”并不是一个很好的回答。这只是我的意见,我正在寻找与OP相同的事情,但没有人提供任何帮助。 - FatalKeystroke
为什么要踩这个答案?我已经点赞了它。没有使用任何第三方模块,这里的答案虽然比较笼统,但在技术上是正确的,而且替代方案也是合理的。 - Sunny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接