У меня есть следующий код nodejs, который загружает файл, вызывая серверный API (написанный мной) и передавая содержимое файла как запрос из нескольких частей. Проблема в том, что мой код отлично работает с небольшими файлами, но не работает с большими файлами (1 МБ или выше). Я почти уверен, что это проблема в моем коде, но я не могу выяснить, что это такое.
// 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]);
}
Я с нетерпением жду ваших предложений.