2015-02-06 3 views
0

мне нужно сохранить некоторые файлы, такие как: изображения, видео, PDF ... В MongoDB, поэтому я использую gridfs-поток и express.jsсохраненных файлов непосредственно в MongoDB с gridfs потоком

var file = req.files.file; 
req.pipe(gfs.createWriteStream({ 
    filename:file.originalname, 
    mode:"w", 
    chunkSize:1024*4, 
    content_type:file.mimetype, 
    root:"fs" 
}) 
res.send(200); 

для тестирования я использовать почтальона и установить POST-запрос таким образом:

POST /fs/upload HTTP/1.1 
Host: localhost:5000 
Cache-Control: no-cache 

----WebKitFormBoundaryE19zNvXGzXaLvS5C 
Content-Disposition: form-data; name="file"; filename="epic.png" 
Content-Type: image/png 


    ----WebKitFormBoundaryE19zNvXGzXaLvS5C 

проблема заключается в том, что этот способ просто хранить данные файла:

{ 
    "_id" : ObjectId("54d14ec5b102fe401519a3c1"), 
    "filename" : "epic.png", 
    "contentType" : "image/png", 
    "length" : 0, 
    "chunkSize" : 4096, 
    "uploadDate" : ISODate("2015-02-03T22:42:14.730Z"), 
    "aliases" : null, 
    "metadata" : null, 
    "md5" : "993fb9ce262a96a81c79a38106147e95" 
} 

но не содержание, которое я имею в виду для двоичных данных для него, в mongodb - это хранилище, для которого длина проформы равна 0, bacause не имеет никаких кусков в fs.chucks.

ответ

2

Чтение в блогах нашли ответ на потоковые данные непосредственно в базе данных с express.js, gridfs-stream.js и multer промежуточное программное обеспечение таким образом:

var multer = require('multer'); 

app.post('/fs/upload', multer({ 
    upload: null,// take uploading process 

    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" 
     }); 
    }, 

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

    onFileUploadComplete: function (file) { 
     //end process 
     this.upload.on('drain', function() { 
      this.upload.end(); 
     }); 
    } 
}), function (req, res) { 
    res.sendStatus(200); 
}); 

Для тестирования этого:

app.route('/fs/download/:file').get(function (req, res) { 
    var readstream = gfs.createReadStream({_id: req.params.file}); 
    readstream.pipe(res); 
}); 
+0

ли это действительно работает для вас, потому что это не для меня. Файл никогда не помещался в Gridfs, хотя я получил ошибку, что end() не является функцией. –

+0

Btw: Ваш пример работает сейчас, если я удаляю функцию события «утечка» вокруг «this.upload.end()». Есть ли проблемы, если я реализую это таким образом? –

+0

Хорошая точка, я не уверен, что промежуточное программное обеспечение multer takecare somethig похоже на событие стока, когда файлы разбора могут быть с свойством [inMemory] (https://github.com/expressjs/multer#inmemory), которые должны работать, если мультер использовать трубу или некоторые аналогичные в противном случае colud используют другое промежуточное программное обеспечение, которое использует трубу – Maxtermax

Смежные вопросы