从mongodb + gridfs检索图像到Ember js

时间:2018-03-10 03:01:25

标签: javascript node.js mongodb ember.js sails.js

我在Ember JS中有一个函数,它将图像上传到Sails JS,后者使用“gridfs”适配器将图像存储在Mongo数据库中,到目前为止一直很好。

我可以看到更新的块和文件记录,一切运行顺利。

问题在于检索图像本身,我不知道为什么但是看起来Ember找不到刚刚上传的图像,我试图使用“gridfs”适配器中描述的读取方法但是得到了什么都没有。

这是我的Ember模板

<div class="image">
    {{#each model.files as |image|}}
        <img src="http:localhost:1337/{{file.path}}" class="img-thumbnail">
    {{/each}}
</div>

Ember控制器中的My Upload方法是:

upload(file) {
    file.upload('http://localhost:1337/uploads/file').then(response => {
        this.get('model.files).pushObject({ path : response.body.file })
})

Sails JS中的My Upload Controller是:

module.exports = {
    file : function(req, res) {
        console.log(req.body);
        req.file('file').upload({
            adapter : require('skipper-gridfs'),
            uri : 'mongodb://192.168.99.100:32769/admin.uploads',
        }, function (err, files) {
            if (err) return res.negotiate('this is my error ' + err);
            skipperAdapter.read(files, function(error, file) {
                if (err) return res.negotiate('Reading Error' + err);
                console.log(files, file);
                res.json({ file : files[0] })
            })
        })
    }
};

也试过

module.exports = {
    file : function(req, res) {
        console.log(req.body);
        req.file('file').upload({
            adapter : require('skipper-gridfs'),
            uri : 'mongodb://192.168.99.100:32769/admin.uploads',
        }, function (err, files) {
            if (err) return res.negotiate('this is my error ' + err);
            res.json( { file : files[0].fd.split('/assets') } )[0]
        });
    }
};

我收到错误“GET http://localhost:1338/237e0d9e-7554-41e0-b2ac-666cdc5c2efa.jpg 404(Not Found)”

1 个答案:

答案 0 :(得分:0)

我会从这开始:

  

我收到错误&#34; GET   http://localhost:1338/237e0d9e-7554-41e0-b2ac-666cdc5c2efa.jpg 404   (未找到)&#34;

首先,您应该检查谁正在为返回404的端点提供服务。您是否有路由和控制器响应匹配的网址:/:file_name

您还可以做的是尝试通过该端点动态地(通过控制器操作)提供硬编码文件(图像),以确保其他一切正常。然后你可以看到与gridfs集成还有什么问题。我的猜测是你不能直接使用文件路径,但需要使用它来查询gridfs文件,然后将gridfs的响应流/返回给客户端(通过控制器操作)。我的意思是做类似于下面的代码(取自https://ciphertrick.com/2017/02/28/file-upload-with-nodejs-and-gridfs-mongodb/):

app.get('/file/:filename', function(req, res){
    // replace gfs with whatever you make a connection to gfs with e.g. the adapter you're mentioning
    gfs.collection('ctFiles'); //set collection name to lookup into

    /** First check if file exists */
    gfs.files.find({filename: req.params.filename}).toArray(function(err, files){
        if(!files || files.length === 0){
            return res.status(404).json({
                responseCode: 1,
                responseMessage: "error"
            });
        }
        /** create read stream */
        var readstream = gfs.createReadStream({
            filename: files[0].filename,
            root: "ctFiles"
        });
        /** set the proper content type */
        res.set('Content-Type', files[0].contentType)
        /** return response */
        return readstream.pipe(res);
    });
});