Pure Node.js文件上载(多部分POST)而不使用框架

时间:2014-03-23 22:59:10

标签: node.js

第三方图书馆" node-formidable"并且"表达"能够处理多部分POST请求(例如,使用文件上传表单),但我不想使用任何第三方代码。如何在Node.js上的纯JavaScript中进行文件上载过程?

在这方面资源非常少。如何才能做到这一点?谢谢,爱情。

3 个答案:

答案 0 :(得分:2)

只是为了澄清,因为似乎有些人对另一个答案没有多大帮助感到愤怒:没有简单的方法可以做到这一点,而不依赖于图书馆为你做这件事。

首先,这里是另一个问题的答案,试图澄清POST文件上传时发生的事情:https://stackoverflow.com/a/8660740/2071242

总而言之,要解析此类上传,您首先需要检查包含" multipart / form-data"的内容类型标头。并且,如果存在,则读取标题内的边界属性。

在此之后,内容分为多个部分,每个部分以边界字符串开头,包括一些额外的标题,然后是空白行后的数据本身。只要在上传的数据中不存在这样的字节序列,浏览器就可以非常自由地选择边界字符串(详见http://tools.ietf.org/html/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 library is doing

因此,经过类似的考虑后,我个人决定要使用的是库。重新实现这样的解析器非常容易出错,在我看来不值得努力。但是如果你真的想避免使用任何库,那么检查强大的代码可能是一个好的开始。

答案 1 :(得分:1)

这是一个有点老的问题,但仍然很相关。
我一直在寻找类似的解决方案,但没有运气。所以决定做我自己的,这可能对其他一些用户有用。
要点:https://gist.github.com/patrikbego/6b80c6cfaf4f4e6c119560e919409bb2

Nodejs 本身推荐(见hereformidable,但我认为这样的基本功能应该由 Nodejs 开箱即用提供。

答案 2 :(得分:0)

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

有关multipart/form-data的详情,请参阅http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

我认为最好的解决方案是使用formidable。它处理不同的场景,我认为它是完美的。