3

現在、Sails.js を使用して Web を構築していますが、GridFS から画像ファイルを取得する際に行き詰まりました。skipper-gridfs を使用してファイルを mongo gridfs に正常にアップロードしました。ファイルを正しい方法で表示する方法がわかりません (Sails.js と Node システムは初めてです)

これは、Gridfs から画像ファイルを取得するための私のコードで、FileController.js のようになります (私は gridfs-stream を使用しています)。

show: function  (req, res, next) {
    var mongo = require('mongodb');
    var Grid = require('gridfs-stream');
    var buffer="";

    // create or use an existing mongodb-native db instance
    var db = new mongo.Db('testDb', new mongo.Server("192.168.0.2", 27017), {safe:true});
    var gfs = Grid(db, mongo);

    // streaming from gridfs
    var readstream = gfs.createReadStream({
      filename: 'e1ecfb02-e095-4e2f.png'
    });

    //check if file exist
    gfs.exist({
      filename: 'e1ecfb02-e095-4e2f.png'
    }, function (err, found) {
      if (err) return handleError(err);
      found ? console.log('File exists') : console.log('File does not exist');
    });

    //buffer data
    readstream.on("data", function (chunk) {
        buffer += chunk;
        console.log("adsf", chunk);
    });

    // dump contents to console when complete
    readstream.on("end", function () {
        console.log("contents of file:\n\n", buffer);
    });     
}

実行すると、コンソールには何も表示されませんでした。エラーもありません。

これを修正するにはどうすればよいですか?

追加の質問:

  1. gridfs を使用する代わりに、ローカル ディスクとの間でファイルを保存/読み取りする方が簡単ですか?
  2. gridfs 形式のファイルを取得するために gridfs-stream を選択するのは正しいですか?
4

2 に答える 2

2

コードには、値を受け取り、その値に対応する必要なファイルを返すskipper-gridfs「読み取り」メソッドがあります。fdそのため、その方法で mongo からそのファイルを取得し、応答として送信するだけです。ファイルが動作するはずです。

download: function (req, res) {
    var blobAdapter = require('skipper-gridfs')({
        uri: 'mongodb://localhost:27017/mydbname.images'
    });

    var fd = req.param('fd'); // value of fd comes here from get request
    blobAdapter.read(fd, function(error , file) {
        if(error) {
            res.json(error);
        } else {
            res.contentType('image/png');
            res.send(new Buffer(file));
        }
    });
}

私はそれが役立つことを願っています:)

追加の質問:

  1. はい、gridfs を使用すると、パフォーマンスと効率の両方が向上します。通常、mongodb にはおそらくバイナリ ファイル用に 16MB の制限がありますが、gridfs を使用すると、任意のサイズのファイルを保存でき、それらをチャンクに分割して保存します。

  2. 取得は上に示されています。

于 2015-01-25T17:38:08.267 に答える
0

セイルでskipper-gridfsを使用して、アップロード/ダウンロードを管理できるようになりました。

var blobAdapter = require('skipper-gridfs')({uri: 'mongodb://jimmy@j1mtr0n1xx@mongo.jimmy.com:27017/coolapp.avatar_uploads' });

アップロード:

req.file('avatar')
.upload(blobAdapter().receive(), function whenDone(err, uploadedFiles) {
  if (err) return res.negotiate(err);
  else return res.ok({
    files: uploadedFiles,
    textParams: req.params.all()
  });
});

ダウンロード

blobAdapter.read(filename, callback);

mongo にアップロードすると、ファイル名が変更されることに注意してください。最初の応答で返されたファイル名を使用する必要があります。

于 2014-10-30T16:24:13.583 に答える