2011-07-12 10 views
3

次の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]); 
     } 

をやっているものです。

+0

はどこだ「post_data」へのファイルの内容を読み取るコード? – Pointy

+2

ファイルのアップロードには良いライブラリがあります:https://github.com/felixge/node-formidable。あなたはそれを見たいかもしれませんか? – Alfred

答えて

1

request.writeに配列または文字列のいずれかを渡す必要があります。 post_dataは文字列の配列ですか、配列の配列ですか?

また、multipart/form-dataとして投稿しているため、データをその形式に変更する必要があります。あなたはそうしたのですか、ファイルからの生データだけのpost_dataですか?

+0

post_dataの詳細を含めるように説明を変更しました – Gaurav

関連する問題