Node.js AJAX загрузчик файлов - PullRequest
       22

Node.js AJAX загрузчик файлов

5 голосов
/ 16 сентября 2010

Я пытаюсь загрузить файл Node.js с помощью индикатора выполнения AJAX.

var formidable = require('./formidable'), http = require('http'), sys = require('sys');
 http.createServer(function(req, res) {
  if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
    // parse a file upload
    var form = new formidable.IncomingForm();
    form.uploadDir = './node_uploads';
    form.keepExtensions = true;
    //print the upload status in bytes
    form.addListener("progress", function(bytesReceived, bytesExpected) {
        //progress as percentage
        progress = (bytesReceived / bytesExpected * 100).toFixed(2);
        mb = (bytesExpected / 1024 / 1024).toFixed(1);
        sys.print("Uploading "+mb+"mb ("+progress+"%)\015");
    });
    //enter here after upload complete
    form.parse(req, function(fields, files) {
        sys.debug("Upload Complete");
        res.writeHead(200, {'content-type': 'text/plain'});
        res.write('received upload:\n\n');
        res.end());
    });
    return;
  }
  if (req.url == '/update') {
        res.writeHead(200, {'content-type': 'text/plain'});
        res.write('<?xml version="1.0"?><response><status>1</status><message>'+ 000 +'</message> </response>');
        res.end();

    }
  // show a file upload form
  res.writeHead(200, {'content-type': 'text/html'});
  res.end
    ( '<form action="/upload" enctype="multipart/form-data" method="post">'
    + '<p id="statuslabel"></p><p id="anotherlabel"></p>' 
    + '<input type="text" name="title" id="title"><br>'
    + '<input type="file" name="upload" multiple="multiple"><br>'
    + '<input type="submit" value="Upload" id="uploadform">'
    + '</form>'
    );
}).listen(8000, '127.0.0.1');

JQuery довольно длинный, поэтому я вырезал его, но все, что он делает, это запускает таймер и запрашивает данные из обновления и устанавливает их на этикетке.

С этим кодом узел будет принимать несколько загрузок с разных хостов? Также Firefox, похоже, не работает, но Safari / Chrome что-нибудь понимает? Как бы я запросил статус для загрузки файла?

Спасибо, Алекс

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Вам понадобится способ однозначно идентифицировать конкретную загрузку. Форма должна содержать уникальный идентификатор в качестве скрытого поля, которое идентифицирует загрузку. Затем при загрузке вы можете сохранить карту идентификатора -> уровень прогресса, и вызов «update» передаст этот идентификатор, чтобы убедиться, что он смотрит на правильный индикатор прогресса.

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

Чтобы обойти это, вам может понадобиться socket.io , чтобы открыть соединение с сервером, который остается открытым до начала загрузки, и получать обновления по этому соединению по мере загрузки.

0 голосов
/ 22 июня 2012

Для того, чтобы просто ответить на третий вопрос

Как бы я запросил статус для загрузки файла?

У грозного есть событие "progess":

Event: 'progress' (bytesReceived, bytesExpected)

С этим вы можете легко следить за вашими успехами и возвращать их по вашему готовому обновлению.

Так что просто опросите ваш ajax при вызове обновления, например, с идентификатором сеанса или другим уникальным идентификатором, который знают обе стороны.

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