0

Express 3.x、mongoose 3.3.x、および gridfs-stream モジュールで NodeJs 1.9.x を使用しています。以下はアップロードコードです。これはうまく機能しています。

var mongoose = require('mongoose');
var fs       = require('fs');
var GridStrm = require('gridfs-stream');

exports.stream_ajax_upload_file = function(req, res){
    var fileType =  req.header('X-File-Type');
    var fileName =  req.header('X-File-Name');
    var uniqId   =  req.param('uniqId', '112211112111');
    var conn     = mongoose.createConnection('localhost', 'TestArun', 27017);
    conn.once('open', function () {

        var gfs     = GridStrm(conn.db, mongoose.mongo);
        var fileId  = new ObjectID(uniqId);
        writestream = gfs.createWriteStream(fileId, [{"content_type": fileType, "metadata":{ "fileName": fileName, "uploaded_at": (new Date()).toString() }}]);

        req.on('data', function(data) {
            console.log("Writing stream in to gridfs");
            writestream.write(data);
        });

        req.on('end', function(data) {
            writestream.end();
            res.send("I think it is uoploaded: ID::" + uniqId);
        });
    });

}

アップロードされたデータを gridfs のチャンクとして見ることができます。以下はダウンロードコードです。

var mongoose = require('mongoose'); 
var fs       = require('fs');
var GridStrm = require('gridfs-stream');

exports.download_file_as_stream = function(req, res){
    var uniqId =  req.param('uniqId', '112211112111');
    var conn = mongoose.createConnection('localhost', 'TestArun', 27017);
    conn.once('open', function () {     
        var gfs         = GridStrm(conn.db, mongoose.mongo);
        var fileId      = new ObjectID(uniqId);
        var readstream  = gfs.createReadStream(fileId, [{"content_type": 'application/pdf'}]);
        //res.header('content-type','application/pdf');
        readstream.pipe(res);
    }); 
}

問題は、適切なファイルをダウンロードできないことです。ダウンロードしようとすると、リクエストURLの名前でダウンロードしているファイルを取得しています。つまり、 download_file_as_streamです。ただし、サイズはアップロードされたファイルと同じです。content-type 等の設定に問題があると思います。どこに問題があるのか​​ わかりません。アップロードまたはダウンロード セクションにあるかどうか。

4

1 に答える 1

0

content_typewriteStream で機能させるには、オプションも渡す必要がありますmode = 'w'。デフォルトのモードは w+ ですが、w+ では content_type は更新されません。

readStream では、db に格納されているため、content_type 設定を提供する必要はありません。

于 2013-04-09T06:34:42.710 に答える