为什么Node.js http服务直接pipe请求时会写入form-data头部到文件?
两段代码的核心差异
两段代码处理的请求Content-Type类型完全不同,直接决定了HTTP请求体的内容格式:
- 测试代码处理的是
multipart/form-data类型的请求:你使用curl的-F参数发起请求时,curl会自动把请求体封装为multipart表单格式,这类格式本身就包含边界分隔符、每个表单字段的描述头(比如Content-Disposition)、字段内容,最后还有结束边界。你直接把原生req的整个请求体pipe到文件,自然会把这些表单结构信息一起写入。 - 旧图片上传接口处理的是
image/*类型的二进制请求:代码里req.is("image/*")的校验逻辑已经说明,这个接口只接收请求体直接为图片二进制的请求,没有经过multipart表单封装,整个请求体本身就是纯净的图片内容,pipe之后自然不会有多余信息。
解决方案
如果需要从multipart/form-data请求中提取单独的文件内容,不能直接pipe整个req对象,需要先引入multer、busboy这类multipart解析工具,解析后拿到对应字段的文件流再写入目标文件。
内容的提问来源于stack exchange,提问作者Tom Klino
相关产品推荐
相关产品推荐

