Как обрабатывать данные формы в запросах http в nodejs

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

request.chunks = [];
request.on('data', function (chunk) {
    request.chunks.push( chunk.toString());
};

а вот console.log блоков, когда клиент загружает файл (в зависимости от браузера границы меняются):

-----------------------------7dd2c419180232
Content-Disposition: form-data; name="filename"


-----------------------------7dd2c419180232
Content-Disposition: form-data; name="uploadfile"; filename="first.txt"
Content-Type: application/octet-stream

the content of first file

-----------------------------7dd2c419180232
Content-Disposition: form-data; name="wfilename"


-----------------------------7dd2c419180232
Content-Disposition: form-data; name="wuploadfile"; filename="second.txt"
Content-Type: application/octet-stream

the content of the second file

-----------------------------7dd2c419180232--

Я обработал проблему с помощью нескольких регулярных выражений для извлечения каждого имени файла и каждого содержимого файла на request.chunks переменная, но браузеры имеют разные тенденции (для этих границ, например, для Google Chrome, например: '------WebKit...'), и мне интересно, есть ли прямой способ для анализа имени файла и файл-контент (очевидно, из request.chunks не request) с некоторыми модулями, такими как грозный или многочастный или строка запроса?


Благодаря @micnic я придумал парсер для заголовков. Это может потребовать пересмотра, которые приветствуются на этом уровне:

exports.parseMultipart = function(request) {

    // Convert the chunks to string
    var str = request.chunks.toString();

    // Get the boundry out pf header
    var boundry = '--' + request.headers["content-type"].substring(request.headers["content-type"].indexOf('=')+1, request.headers["content-type"].length);

    // Initialization
    var request_data = {};
    index = 0;


    // For each form element, store the value in request_data
    while (str.indexOf(boundry, index) != -1) {
        index += boundry.length;
        i = str.indexOf(" name=\"",index);
        j = str.indexOf("\"",i+7);
        name = str.substring(i+7,j);
        var value = {};
        if (str.charAt(j+1)==';') {
            value["type"] = "file";
            i = j + 3;
            j = str.indexOf("\"",i+14);
            filename = str.substring(i+10, j);
            value["filename"] = filename;
            i = j + 17;
            j = str.indexOf("\r", i);
            contentType = str.substring(i, j);
            value["content-type"] = contentType;
            i = j + 4;
            j = str.indexOf("\n\r\n" + boundry, i);
            fileContent = str.substring(i, j);
            value["content"] = fileContent;
        } else {
            value["type"] = "field";
            i = j + 5;
            j = str.indexOf("\r\n" + boundry,i);
            value["content"] = str.substring(i,j);
        }
        index = str.indexOf(boundry, index) + 2;
        request_data[name] = value;
    }
    return request_data;
}

1 ответ

Для моего модуля simpleS я написал парсер: https://github.com/micnic/simpleS/blob/ccc8e600013da70d5204c1b66149e834d2c0fea2/utils/utils.js#L365

Может быть, это немного сложно понять, но это делает работу.

"... Интересно, есть ли прямой способ для анализа имени файла и содержимого файла с некоторыми модулями, такими как грозный или многочастный или строка запроса? ...", вы читали документы грозного человека?

оттуда:

var formidable = require('formidable');

/* ... */

var form = new formidable.IncomingForm();

form.parse(req, function(err, fields, files) {
  res.writeHead(200, {'content-type': 'text/plain'});
  res.write('received upload:\n\n');
  res.end(util.inspect({fields: fields, files: files}));
});

/* ... */
Другие вопросы по тегам