0

我正在使用 busboy 开发一个带有 node.js 和 express.js 的文件共享平台

它目前运行良好,但上传大文件。

如果我这样做,则在上传大文件时服务器不会接受任何新请求。

我那正常吗?如果是,如何改善这种行为,即使这意味着上传需要更多时间......

现在,我在 ubuntu 上的一台相当不错的 PC(华硕 i7/8G)上的 localhost 上进行开发和测试。

当我开始上传一个大文件并打开一个新选项卡以转到应用程序时,该选项卡仅在上传完成后加载。

应用程序加载:

var app = express();

//...

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());
app.use(methodOverride());

// Request multipart parsing middleware
app.use(busboy());

// default options, immediately start reading from the request stream and 
// parsing 
app.use(busboy({ immediate: true }));

我的上传方法files controller

exports.create = function(req, res) {

    var _file = new File(req.body);

    req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {

        file.on('data', function(data) {
            _file.data += data;
        });
        file.on('end', function() {
            _file.save(function(err) {
                if (err) {
                    console.error(err);
                    return res.status(500).send({
                        message: errorHandler.getErrorMessage(err)
                    });
                } else {
                    // doing some stuff on save
                }
            });
        });
    });

    // req.busboy.on('field', function(key, value, keyTruncated, valueTruncated) {
    //  console.log('Field [' + key + ']: value: ' + value);
    // });
    // req.busboy.on('finish', function() {
    //  console.log('Done parsing form!');
    // });

    req.pipe(req.busboy);
};
4

1 回答 1

1

这里至少有一些问题:

  • busboy正在加载两次。您应该app.use(busboy({ immediate: true }));app.js.
  • 接下来,所有文件都被缓冲在内存中(_file.data += data;。相反,您应该将文件流式传输到某个地方,无论是到磁盘、某些网络存储服务(如 Amazon 的 S3)还是流程之外的任何其他地方。
  • 一旦您切换到流式传输,这确实是一个有争议的问题,但从技术上讲,使用您当前的缓冲代码,您将多个文件连接在一起,因为同一个File对象用于整个请求。如果您确定只有一个文件将被发送(例如,您始终是客户端),那么这可能不是问题,但值得注意的是。
于 2015-07-19T23:12:24.023 回答