我有以下nodejs代码,它通过调用服务器端API(由我编写)上传文件并将文件内容作为多部分请求传递。问题是我的代码与小文件完美配合,但是大文件(1 MB或更高)失败。我很确定这是我的代码中的一个问题,但我无法弄清楚它是什么。
// assume file content have been read into post_data array
//Make post
var google = http.createClient(443, host, secure = true);
var filepath = '/v2_0/put_file/';
var GMTdate = (new Date()).toGMTString();
var fileName = encodeURIComponent(destination);
console.log("fileName : " + fileName);
console.log("Path : " + filepath);
var header = {
'Host': host,
'Authorization': 'Basic ' + authStr,
'Content-Type': 'multipart/form-data; boundary=0xLhTaLbOkNdArZ',
'Last-Modified': GMTdate,
'Filename': fileName,
'Last-Access-By': username
};
var request = google.request('POST', filepath, header);
for (var i = 0; i < post_data.length; i++) {
request.write(post_data[i]);
}
request.end();
request.addListener('response', function(response){
var noBytest = 0;
response.setEncoding('utf8');
console.log('STATUS: ' + response);
console.log('STATUS: ' + response.statusCode);
console.log('HEADERS: ' + JSON.stringify(response.headers));
console.log('File Size: ' + response.headers['content-length'] + " bytes.");
从日志中,我看到控制权来自request.end();但我没有看到在request.addListener()块之后写的最后几个日志。
在过去的几天里,我一直在试着理解为什么它适用于小文件但不适用于较大的文件。我没有看到任何超时,代码似乎只是挂起,直到我把它杀掉。
任何人都可以指导我做错什么吗?
更新:
post_data是一个数组,这就是我正在做的事情
post_data = [];
console.log('ContentType =' + ContentType + "\n\nEncoding Style =" + encodingStyle);
post_data.push(new Buffer(EncodeFilePart(boundary, ContentType, 'theFile', FileNameOnly), 'ascii'));
var file_contents = '';
var file_reader = fs.createReadStream(filename, {
encoding: encodingStyle
});
file_reader.on('data', function(data){
console.log('in data');
file_contents += data;
});
file_reader.on('end', function(){
post_data.push(new Buffer(file_contents, encodingStyle))
post_data.push(new Buffer("\r\n--" + boundary + "--\r\n", 'ascii'));
...
var request = google.request('POST', filepath, header);
for (var i = 0; i < post_data.length; i++) {
request.write(post_data[i]);
}
我期待你的建议。
答案 0 :(得分:1)
您应该将数组或字符串传递给request.write。 post_data是字符串数组还是数组数组?
此外,您将其发布为multipart / form-data,这意味着您必须将数据修改为该格式。你有没有这样做,或者post_data只是文件中的原始数据?
答案 1 :(得分:-1)
checkout node-formidable和这篇文章http://debuggable.com/posts/parsing-file-uploads-at-500-mb-s-with-node-js:4c03862e-351c-4faa-bb67-4365cbdd56cb