Загрузить большой файл с помощью nodejs - PullRequest
3 голосов
/ 12 июля 2011

У меня есть следующий код 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]);
        }

Я с нетерпением жду ваших предложений.

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Вы должны передавать массив или строку в request.write. Является ли post_data массивом строк или массивом массивов?

Кроме того, вы публикуете его как multipart / form-data, что означает, что вам нужно изменить данные в этом формате. Вы сделали это, или post_data - это просто необработанные данные из файла?

0 голосов
/ 23 ноября 2012

Оформить заказ на узел-грозный и этот пост http://debuggable.com/posts/parsing-file-uploads-at-500-mb-s-with-node-js:4c03862e-351c-4faa-bb67-4365cbdd56cb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...