我在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)”
答案 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);
});
});