NodeJS Загрузка веб-приложения прекращается. Начало файла - PullRequest
4 голосов
/ 15 августа 2011

Я работаю над проектом в NodeJS, который предусматривает загрузку файлов. Загрузка выполняется на стороне клиента с кодом:

$('#file-upload').bind('change focus click', function() {
    var file = jQuery(this)[0].files[0];
    if (file && file.fileName) {
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener('progress', onProgressHandler, false);
        xhr.upload.addEventListener('load', transferComplete, false);
        xhr.open('POST', '/upload', true);
        xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        xhr.setRequestHeader('X-File-Name', encodeURIComponent(file.fileName));
        xhr.setRequestHeader('Content-Type', 'application/octet-stream');
        xhr.send(file);


        function onProgressHandler(evt) {
            var percentage = event.loaded/event.total*100;
            console.log(percentage);
        }
        function transferComplete(evt) {
            console.log('Done');
        }
    }
});

А на стороне сервера я использую:

app.post('/upload', function(req, res, next) {
    if(req.xhr) {
        console.log('Uploading...');
        var fName = req.header('x-file-name');
        var fSize = req.header('x-file-size');
        var fType = req.header('x-file-type');
        var ws = fs.createWriteStream('./'+fName)

        req.on('data', function(data) {
            console.log('DATA');
            ws.write(data);
        });
        req.on('end', function() {
            console.log('All Done!!!!');
        });
    }
});

Этот код работает в одиночку, но в сочетании с остальной частью моего гораздо более крупного проекта, он, кажется, прерывает начало больших файлов и игнорирует маленькие файлы все вместе. Если я загружаю небольшой файл, console.log ('DATA') никогда не запускается и запускается для больших файлов, но не для начала файла. Я полагаю, что по какой-то причине он отправляет файл досрочно, и к тому времени, когда моя функция забирает его, начало (или, в случае небольшого файла, всего) уже отправлено. Я не знаю, что могло бы быть причиной этого.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 ноября 2012

У меня точно такая же проблема. Меня беспокоит, что проблема заключается в слишком большой логике между запросом и событием on('data'). Я тестирую на локальном сервере, и количество логики между началом запроса и регистрацией события on data незначительно. Но тот факт, что мне не нужно переходить через Интернет, чтобы выполнить загрузку, делает эту проблему намного хуже? Вы все еще испытываете эту проблему?

2 голосов
/ 24 августа 2011

Я понял это. Было так много логики между определением моего маршрута и фактическим кодом загрузки файла, что он не был готов к прослушиванию файла.

...