Ошибка при загрузке файла с помощью node.js - PullRequest
2 голосов
/ 06 января 2012

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

app.js

var formidable = require('formidable'),
    http = require('http'),
    util = require('util');

app.get('/song/add', function (req, res) {
    res.writeHead(200, {'content-type': 'text/html'});
    res.end(
        '<form action="/song/upload" enctype="multipart/form-data" method="post">'+
        '<input type="text" name="title"><br>'+
        '<input type="file" name="upload" multiple="multiple"><br>'+
        '<input type="submit" value="Upload">'+
        '</form>'
    );
});

app.post('/song/upload', function (req, res) {
    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}));
    });
    return;
});

Ответы [ 4 ]

1 голос
/ 07 января 2012

Просто удалите эту строку (app.use(express.bodyParser())) в своем коде, это должно работать, я верю.

Но почему вы хотите использовать грозный? Я считаю, что экспресс-парсер основывается на огромном и более чистом в использовании. Так как он даже анализирует другие типы тела, кроме типа формы, такого как JSON, но грозный вызов выдаст ошибку, если тип тела не поддерживается. Если в вашем коде app.use(express.bodyParser()), то вы можете сделать это, чтобы получить то, что вы хотите:

app.post('/song/upload', function(req, res){
    res.writeHead(200, {'content-type': 'text/plain'});
    res.write('received upload:\n\n');
    res.end(util.inspect(req.body));
    return;
 });
1 голос
/ 07 января 2012

Возможно, у вас включена опция экспресс-парсера тела. Проверьте ваш конфиг на что-то вроде:

app.use(express.bodyParser())

Думаю, проблема в том, что Formidable ожидает потоковые события для этого файла, и они уже были использованы Express к моменту вызова вашего app.post обратного вызова. Поскольку обратный вызов form.parse срабатывает только на end, ответ никогда не обрабатывается.

Решением будет использование Express или Formidable, вы можете отключить опцию конфигурации, если хотите использовать Formidable.

0 голосов
/ 21 апреля 2014

Не использовать bodyParser с Express 4.x: http://andrewkelley.me/post/do-not-use-bodyparser-with-express-js.html

использовать

app.use (express.json ());

app.use (express.urlencoded ());

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

Измените код на:

return res.end (util.inspect ({fields: fields, files: files}));

и удалите возврат в конце.

0 голосов
/ 13 мая 2012

Проблема, которую я вижу здесь, это новый анализатор тела (начиная с Connect 1.8.0).Если вы хотите использовать новый Connect с огромным, вам нужно удалить многочастный парсер из body parser:

delete express.bodyParser.parse['multipart/form-data'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...