为什么我没有通过node.js获得完全相同的文件大小?

时间:2016-10-25 09:03:15

标签: node.js

我有一个简单的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?

我错过了哪些概念?

1 个答案:

答案 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

因此,您需要更复杂的代码才能从中提取文件部分数据。像busboyformidable这样的NPM模块就是这样做的。