使用吃水线时应指定哪种types的图像?

Sails中的水线非常酷,这个抽象层是非常有用的。 我的问题是:如何使用水线存储图像? 有一个称为二进制的types。 我应该使用那种types吗? 我应该像其他数据types一样处理图像吗? 如何validation一个图像,说确保其格式是几个给定的选项,如PNG,JPEG等

我不会推荐使用二进制来直接在你的数据库中存储图像。 如果您的用户想上传图片,这是一种痛苦,我不认为水线支持stream式传输到数据库。 有一个替代虽然!

Mongodb有一个名为gridfs的function,它将大文件分割成块并存储起来。

帆的file upload库, 船长 ,有适配器的概念(如waterline),它允许你插入一个适配器进入file upload过程。 有一个叫做skipper-gridfs的适配器可以为你做到这一点! 我用过这个,使用起来非常简单。 你所做的是:

定义一个sails模型,让我们称之为Image,它具有属性filename和filedescriptor

filedescriptor是mongo用来引用块的ID。基本上,你将要在gridfs中存储你的文件(任何types的文件)并接收一个filedescriptor。 你将要保存在一个模型(图像模型)中,然后使用该模型从网格下载文件。

这里有一些上传代码:

var adapter = require('skipper-gridfs'); upload : function (req, res, next) { var params = req.params.all(); var gf = _gridfs; //upload file to gridfs req.file('file').upload( { adapter:adapter, uri:constring }, function (err,uploadedFiles){ if (err) {return res.send(err);} var imagePromiseArray = []; //loop over the files uploaded to gridfs and store references to their IDs in your Image model _.each(uploadedFiles,function(file){ var imageParams = { filename:file.filename, fileDescriptor:file.fd }; imagePromiseArray.push(Image.create(imageParams)); }); Promise .all(imagePromiseArray) .then(function(results){ res.status(200); return res.send(results); }) .catch(function(err){ res.status(500); res.send(err); }); }); }, 

这里有一些下载代码:

 var mime = require('mime'); download: function (req, res, next) { var params = req.params.all(); Image .findOne(params.id) .then(function (image) { debugger; _gridfs.read(image.fileDescriptor, function (err, data) { if (err) { res.status(500); res.json(err); } if (!data) { res.status(404); res.json({error: 'image not found'}); } else { res.setHeader('Content-disposition', 'attachment; filename=' + image.filename); var type = mime.lookup(image.filename); res.setHeader('Content-type', type); res.send(data); } }); }) .catch(function (err) { res.json(err); }); },