【问题标题】:File download is not working with nodejs gridfs文件下载不适用于nodejs gridfs
【发布时间】:2014-04-19 12:47:15
【问题描述】:

我正在使用 node 和 express 将图像上传到 gridfs-stream..上传工作正常但无法下载

  app.post('/upload', function (req, res) {
    var tempfile = req.files.displayImage.path;
    var origname = req.files.displayImage.name;
    var _id = guid();
    var writestream = gfs.createWriteStream({
        filename: _id
    });
    // open a stream to the temporary file created by Express...
    fs.createReadStream(tempfile)
        .on('end', function () {
            res.send(_id);
        })
        .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);
});  

以上代码无法通过此cmddownload?filename=acf58ae4-c853-f9f3-5c66-c395b663298a下载图片

【问题讨论】:

    标签: node.js mongodb gridfs-stream


    【解决方案1】:

    您可能需要检查参数中的值。但希望这个接近的最小样本能提供一些帮助:

    更新

    它有帮助,因为它突出显示您正在查找 _id 作为文件名。相反,您应该这样做:

    .createReadStream({
        _id: req.param('filename')
    })
    

    如果没有

    .createReadStream({
        _id: mongoose.Types.ObjectId(req.param('filename'))
    })
    

    由于_id 字段与文件名不同


    app.js

    var express = require('express');
    var routes = require('./routes');
    var http = require('http');
    var path = require('path');
    
    var app = express();
    
    var mongoose = require('mongoose');
    var Grid = require('gridfs-stream');
    Grid.mongo = mongoose.mongo;
    
    var conn = mongoose.createConnection('mongodb://localhost/mytest');
    
    conn.once('open', function() {
        console.log('opened connection');
        gfs = Grid(conn.db);
    
        // all environments
        app.set('port', process.env.PORT || 3000);
        app.use(express.logger('dev'));
        app.use(app.router);
    
        // development only
        if ('development' == app.get('env')) {
            app.use(express.errorHandler());
        }
    
        app.get('/', routes.index);
    
        http.createServer(app).listen(app.get('port'), function(){
            console.log('Express server listening on port ' + app.get('port'));
        });
    
    });
    

    routes/index.js

    exports.index = function(req, res){
    
        res.set('Content-Type', 'image/jpeg');
        gfs.createReadStream({
            filename: 'receptor.jpg'
        }).pipe(res);
    
    };
    

    【讨论】:

    • 我可以读取设置的new ObjectID()的文件吗?感谢您的回答。仍然无法正常工作:(
    • @user3279499 现在问题很清楚了,请参阅编辑。
    • @user3279499 您对答案的接受将是一个很好的谢谢:)
    • 像这样进入控制台...GET /download?filename=%22532305b8b0a858b820f34edd%22 500 2ms - 1.17kb...但是当我尝试使用 localhost:8087/download 查看图像时? filename="532305b8b0a858b820f34edd"..无法渲染它.. :(
    • @user3279499 这里应该有足够的信息供您调试或以其他方式理解问题。请再次通读并重新考虑您正在尝试的内容。我很乐意提供帮助,但我也很忙。我认为 answer 中的信息足够完整,您可以修复代码。
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多