第三方库"node-formidable"和"express"自带处理multipart POST请求的能力(例如使用上传文件表单),但我不想使用任何第三方代码。如何在纯JavaScript和Node.js中实现文件上传过程?
关于此方面的资源非常少。这该如何实现?谢谢,爱了。
第三方库"node-formidable"和"express"自带处理multipart POST请求的能力(例如使用上传文件表单),但我不想使用任何第三方代码。如何在纯JavaScript和Node.js中实现文件上传过程?
关于此方面的资源非常少。这该如何实现?谢谢,爱了。
为了澄清一下,因为似乎有些人对另一个答案不太满意: 没有简单的方法可以在不依靠库的情况下完成此操作。
首先,这里有一个回答另一个问题的答案,试图澄清关于 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的代码可能是一个很好的开始。
如果您不想使用任何模块,我认为您需要自己解析表单。上传文件时,表单将以 multipart/form-data
格式出现,这意味着您的请求内容将被您的浏览器随机生成的字符串分割。您需要在表单开头读取此字符串,尝试加载数据并找到此字符串,然后逐个解析它们。
有关 multipart/form-data
的更多信息,请参考 http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
我认为最好的解决方案是使用 formidable
。它可以处理各种情况,并且我认为它非常完美。