9

ExpressJS を使用して REST API の構築を開始しました。私はノードが初めてなので、ご容赦ください。/upload ルートへの投稿を使用して、ユーザーがファイルを Mongo の GridFS に直接アップロードできるようにしたいと考えています。

ExpressJS のドキュメントで私が理解していることから、req.files.image オブジェクトはアップロード後にルートで使用できます。これには、パスとファイル名の属性も含まれます。しかし、画像データを正確に読み取って GridFS に格納するにはどうすればよいでしょうか?

gridfs-streamを調べましたが、両端を結び付けることができません。最初にファイルを読み取ってから、そのデータを writestream パイプに使用する必要がありますか? または、express からファイル オブジェクトを使用し、それらの属性を使用して書き込みストリームを構築することはできますか? 任意のポインタをいただければ幸いです!

4

1 に答える 1

30

簡単なデモを次に示します。

var express = require('express');
var fs      = require('fs');
var mongo   = require('mongodb');
var Grid    = require('gridfs-stream');
var db      = new mongo.Db('test', new mongo.Server("127.0.0.1", 27017), { safe : false });

db.open(function (err) {
  if (err) {
    throw err;
  }
  var gfs = Grid(db, mongo);
  var app = express();

  app.use(express.bodyParser());
  app.post('/upload', function(req, res) {
    var tempfile    = req.files.filename.path;
    var origname    = req.files.filename.name;
    var writestream = gfs.createWriteStream({ filename: origname });
    // open a stream to the temporary file created by Express...
    fs.createReadStream(tempfile)
      .on('end', function() {
        res.send('OK');
      })
      .on('error', function() {
        res.send('ERR');
      })
      // and pipe it to gfs
      .pipe(writestream);
  });

  app.get('/download', function(req, res) {
    // TODO: set proper mime type + filename, handle errors, etc...
    gfs
      // create a read stream from gfs...
      .createReadStream({ filename: req.param('filename') })
      // and pipe it to Express' response
      .pipe(res);
  });

  app.listen(3012);
});

httpieを使用してファイルをアップロードします。

http --form post localhost:3012/upload filename@~/Desktop/test.png

ファイルがアップロードされているかどうかをデータベースで確認できます。

$ mongofiles list -d test
connected to: 127.0.0.1
test.png    5520

再度ダウンロードすることもできます。

http --download get localhost:3012/download?filename=test.png
于 2013-05-10T13:36:56.683 に答える