Получение доступа к потоку необработанных файлов из загрузки файла с огромным количеством узлов

Я создаю приложение, которое загружает некоторые файлы и отправляет их прямо на S3. Я бы предпочел не иметь даже tmp-файла на моем сервере, поэтому я использую модуль Knox и хочу взять необработанный поток из Formidable и отправить его через Knox на S3. Я сделал нечто подобное, используя Knox для загрузки файла с помощью этого кода:

knox.downloads.get(widget.download).on('response',function(sres){
    res.writeHead(200, {
        'Content-Type':'application/zip',
        'Content-Length': sres.headers['content-length'],
        'Content-Disposition':'attachment; filename=' + widget.download
    });
    util.pump(sres, res);
}).end();

Теперь я хотел бы сделать что-то подобное в противоположном направлении (загрузка файла из браузера в S3).

Пока что я написал обработчик событий для захвата каждого фрагмента данных из файла по мере его загрузки:

var form = new formidable.IncomingForm();
form.onPart = function(part){
    if(!part.filename){
        form.handlePart(part);
    }else{
        if(part.name == 'download'){
            // Upload to download bucket
            controller.putDownload(part);
        }else{
            // Upload to the image bucket
            controller.putImage(part);
        }
        //res.send(sys.inspect(part));
    }
}
form.parse(req, function(err, fields, files){
    if(err){
        res.json(err);
    }else{
        res.send(sys.inspect({fields:fields, files:files}), {'content-type':'text/plain'});
        //controller.createWidget(res,fields,files);            
    }
});


controller.putDownload = function(part){
    part.addListener('data', function(buffer){
        knox.download.putStream(data,part.filename, function(err,s3res){
            if(err)throwError(err);
            else{
                console.log(s3res);
            }
        });
    })
    knox.downloads.putStream(part, part.filename, function(err,s3res){

        if(err)throwError(err);
        else{
            console.log(s3res);
        }
    });
}

Но событие data дает мне только буфер. Так можно ли захватить сам поток и отправить его на S3?

41
задан Dave Long 22 October 2011 в 15:04
поделиться