我有一个简单的node.js上传代码。
var http = require('http')
var fs = require('fs')
var server = http.createServer(function(req, res){
if(req.url == '/upload') {
var a = fs.createWriteStream('a.jpg', { defaultEncoding: 'binary'})
req.on('data', function(chunk){
a.write(chunk)
})
.on('end', function()){
a.end()
res.end('okay')
})
}
else {
fs.createReadStream('./index.html').pipe(res);
// just show <form>
}
})
server.listen(5000)
当我上传一些图片时,我无法获得完全相同的文件。 总是文件坏了。
当我尝试使用强力执行此操作时,我可以获得一个很好的文件。 所以我研究了强大但我无法理解它是如何捕获数据并保存的。 我可以找到强大的使用解析器来计算一些关于请求的块的东西,但我没有得到它。
(这绝对是我的大脑问题:()。
无论如何,我的代码与强大之间有什么区别? 我错过了什么?
从http请求中添加所有块并将其保存是错误的方法 fs.createWriteStream还是fs.writeFile?
我错过了哪些概念?
答案 0 :(得分:1)
首先,req
是一个可读流。你可以这样做:
req.pipe(fs.createWriteStream('a.jpg'))
用于上传部分。这是将所有字节数据从请求流复制到文件。
当您将原始文件数据作为请求正文发送时,这将起作用:
curl --data-binary @"/home/user/Desktop/a.jpg" http://localhost:8080/upload
因为这会将请求正文作为图像二进制数据发送,然后将其传输到服务器上的文件。
但是,还有另一种名为multipart/form-data
的请求格式。这是Web浏览器使用<form>
上传文件的内容。
curl -form "image=@/home/user1/Desktop/a.jpg" http://localhost:8080/upload
此处请求正文包含多个“部分”,每个文件附件或表单字段一个,由特殊的“边界”字符分隔:
--------------------------e3f25f5319cd6624
Content-Disposition: form-data; name="image"; filename="a.jpg"
Content-Type: application/octet-stream
JPG IHDRH-ÑtEXtSoftwareAdobe.....raw file data
--------------------------e3f25f5319cd6624
因此,您需要更复杂的代码才能从中提取文件部分数据。像busboy和formidable这样的NPM模块就是这样做的。