次のnodejsコードは、サーバー側のAPI(私が書いた)を呼び出し、ファイルの内容を複数の部分の要求として渡すことによってファイルをアップロードします。問題は、私のコードが小さなファイルでは完全に動作するが、大きなファイル(1 MB以上)では失敗するということです。私はそれが私のコードの問題だと確信していますが、私はそれが何であるかを知ることができません。nodejsを使用して大きなファイルをアップロード
// 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()ブロックの後に書かれた最後のいくつかのログは表示されません。
私は最近数日間、小さなファイルではなく大きなファイルでは機能しないことを理解しようとしていました。私は時間切れが表示されませんし、コードは私がそれを殺すまで掛かっているようです。
私は間違って何をしているのですか?
UPDATE:
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]);
}
をやっているものです。
はどこだ「post_data」へのファイルの内容を読み取るコード? – Pointy
ファイルのアップロードには良いライブラリがあります:https://github.com/felixge/node-formidable。あなたはそれを見たいかもしれませんか? – Alfred