问题: 使用formaidable模块实现stream方式图片上传,报错
发布于 12 年前 作者 fcicada 6551 次浏览 最后一次编辑是 8 年前

我是一nodejs新手,老板要求我能用nodejs实现stream方式上传图片,google良久,发现formidable很好用,也很受人们喜爱,然后在google找到许多例子,但是总是实现不了

 var form = new formidable.IncomingForm();
 form.parse( request, function( error, fields, files ) {
    console.log( "Completed Parsing" );

    if( error ){
        response.writeHead( 500, { "Content-Type" : "text/plain" } );
        response.end( "CRAP! " + error + "\n" );
        return;
    }
}

在这里的时候 总是报错 Error: MultipartParser.end(): stream ended unexpectedly: state = START,在github上有相关问题的讨论,研究良久仍不得其解,望各位帮忙,谢谢。

5 回复

没这么用过,我把我的一个老的例子贴出来,希望有点用。测了一下,还运行正常。

var http = require('http');
var util = require('util');
var formidable = require('formidable');
var TEST_TMP = '/tmp';
var TEST_PORT = 8001;

var server = http.createServer(function(req, res) {
  if (req.url == '/') {
      res.writeHead(200, {'content-type': 'text/html'});
      res.end(
            '<form action="/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>'
        );
    } else if (req.url == '/upload') {
        var files = [];
        var fields = [];
        var form = new formidable.IncomingForm();
        form.uploadDir = TEST_TMP;
        form.on('field', function(field, value) {
            console.log('field event:', field, value);
            fields.push([field, value]);
        });
        form.on('file', function(field, file) {
            console.log('file event:', field, file);
            files.push([field, file]);
        });
        form.on('end', function() {
            util.puts('-> upload done');
            res.writeHead(200, {'content-type': 'text/plain'});
            res.write('received fields:\n\n '+util.inspect(fields));
            res.write('\n\n');
            res.end('received files:\n\n '+util.inspect(files));
        });
        form.parse(req);
    } else {
        res.writeHead(404, {'content-type': 'text/plain'});
        res.end('404');
    }
});

server.listen(TEST_PORT);
util.puts('listening on http://localhost:' + TEST_PORT + '/');

默认的formidable会将文件部分先保存到服务器的临时目录下面,然后在通过fs的方式进行后续操作。如果你只需要保存到服务端文件系统,那么可以在formidable里面指定临时路径位置就好了。但是如果你想保存到别的设备,比如其他的能够接受stream的地方(例如分布式文件系统),那么需要重载form.onPart方法,然后判断if(part.filename),表明这是一个文件,那么part参数就是stream了。

直接使用express3就行了。它包括了formidable

最新版本的 express3 已经用 https://github.com/superjoe30/node-multiparty 别误导人家了…

回到顶部