2015-01-13 3 views
3

Следующий фрагмент кода работает должным образом: он считывает файл, который был загружен с помощью multer [https://github.com/expressjs/multer] и передает его в gridfs. Im также смог вытереть это из gridfs также.Использование multer с опцией inmemory и потоковой передачей в gridfs mongodb

var target = gfs.createWriteStream({ 
      filename: fileItem.originalname, 
      mode: 'w', 
      metadata: metaData 
     }); 

     fs.createReadStream(tempFile) 
      .on('end', function() { 
       console.log('File read and stored'); 
      }) 
      .on('error', function (err) { 
       console.log('Error handling file ' + err); 
      }) 
      .pipe(target); 

     // Attach new file to document list 
     target.on('close', function (file) { 
      filesUploadedList.push(file._id); 

fileItem получен из итерации по файлу req.files.файлов, которые загружают файлы.

Однако, я пытаюсь выяснить параметр inMemory для multer. Если я установил значение true, то в файле fileItem будет заполнен буфер. Просто отметить без этой опции буфер/содержимое fileItem пуст, поэтому в коде выше его чтения из файла fileItem.location.

Каков наилучший способ для заполнения цели содержимым? fs.createReadStream делает трубопровод в данный момент.

Спасибо.

J

+0

может быть, вы заинтересованы : http://stackoverflow.com/questions/28357412/stored-files-directly-in-mongodb-with-gridfs-stream – Maxtermax

ответ

4

Вы можете сделать это с помощью streamifier. Код выглядит должен выглядеть следующим образом:

streamifier.createReadStream(fileItem.buffer).pipe(target); 

Multer ничего на диск не писать, цель теперь населен с буферами/содержимое загружаемого файла.

3

Вы могли бы использовать его таким образом:

(оригинальная идея здесь: stored files directly in mongodb with gridfs-stream)

app.post('/upload',multer({ 
    dest:"./tmp/", 
    upload:null,// take uploading process 
    inMemory:true, //or false, not needed here 

    onFileUploadStart:function(file){ 
     //set upload with WritableStream   
     this.upload = gfs.createWriteStream({ 
      filename:file.originalname, 
      mode:"w", 
      chunkSize:1024*4, 
      content_type:file.mimetype, 
      root:"fs", 
      metadata: {} // put some crazy meta data in here 
     }); 
    }, 

    onFileUploadData:function(file,data) { 
     //put the chunks into db 
     this.upload.write(data); 
    }, 

    onFileUploadComplete:function(file) { 
     //end process 
     this.upload.end(); 
     console.log('successfully written File to MongoDB Gridfs'); 
    } 
    }), 
    function(req,res) { 
     res.sendStatus(200); 
    }); 

Поскольку вы используете onFileUploadData() - функционируют так Gridsfs будет заполняться при поступлении данных. Это работает независимо от установки inMemory в true или false. Следует отметить, что файл.buffer [] может стать очень большим, если вы имеете дело с огромными файлами. Это всего лишь копия всех входящих фрагментов данных.

В теории может быть лучше использовать собственное определенное промежуточное программное обеспечение поверх busboy без выполнения операций с файлами (как используется в Multer).

+1

Это не может быть достигнуто с помощью multer больше, он принимает только два параметра, имя файла и dest –

+0

Фактически это может быть с помощью [StorageEngines] (https://github.com/expressjs/multer/blob/master/StorageEngine.md) – Menixator