我目前正在我的应用程序中创建文件上传系统。我的后端是Sails.js(10.4),它作为我单独的前端(Angular)的API。
我选择存储我上传到MongoDB实例的文件,并使用风帆'内置文件上传模块Skipper。我使用适配器skipper-gridfs(https://github.com/willhuang85/skipper-gridfs)将文件上传到mongo。
现在,上传文件本身不是问题:我在我的客户端上使用dropzone.js,它将上传的文件发送到/ api / v1 / files / upload。文件将被上传。
为了达到这个目的,我在FileController中使用以下代码:
module.exports = {
upload: function(req, res) {
req.file('uploadfile').upload({
// ...any other options here...
adapter: require('skipper-gridfs'),
uri: 'mongodb://localhost:27017/db_name.files'
}, function(err, files) {
if (err) {
return res.serverError(err);
}
console.log('', files);
return res.json({
message: files.length + ' file(s) uploaded successfully!',
files: files
});
});
}
};
现在的问题是:我想在文件上传前对文件进行处理。特别是两件事:
我不知道从哪里开始或如何实现这种功能。所以任何帮助都将不胜感激!
答案 0 :(得分:9)
好的,在摆弄了一段时间后,我找到了一种似乎有效的方法。
它可能会更好,但它确实做了我现在想做的事情:
upload: function(req, res) {
var upload = req.file('file')._files[0].stream,
headers = upload.headers,
byteCount = upload.byteCount,
validated = true,
errorMessages = [],
fileParams = {},
settings = {
allowedTypes: ['image/jpeg', 'image/png'],
maxBytes: 100 * 1024 * 1024
};
// Check file type
if (_.indexOf(settings.allowedTypes, headers['content-type']) === -1) {
validated = false;
errorMessages.push('Wrong filetype (' + headers['content-type'] + ').');
}
// Check file size
if (byteCount > settings.maxBytes) {
validated = false;
errorMessages.push('Filesize exceeded: ' + byteCount + '/' + settings.maxBytes + '.');
}
// Upload the file.
if (validated) {
sails.log.verbose(__filename + ':' + __line + ' [File validated: starting upload.]');
// First upload the file
req.file('file').upload({}, function(err, files) {
if (err) {
return res.serverError(err);
}
fileParams = {
fileName: files[0].fd.split('/').pop().split('.').shift(),
extension: files[0].fd.split('.').pop(),
originalName: upload.filename,
contentType: files[0].type,
fileSize: files[0].size,
uploadedBy: req.userID
};
// Create a File model.
File.create(fileParams, function(err, newFile) {
if (err) {
return res.serverError(err);
}
return res.json(200, {
message: files.length + ' file(s) uploaded successfully!',
file: newFile
});
});
});
} else {
sails.log.verbose(__filename + ':' + __line + ' [File not uploaded: ', errorMessages.join(' - ') + ']');
return res.json(400, {
message: 'File not uploaded: ' + errorMessages.join(' - ')
});
}
},
我选择使用本地文件存储,而不是使用skipper-gridfs,但这个想法保持不变。同样,它并不像它应该的那样完整,但它是一种简单的方法来验证文件类型和大小等简单的东西。如果有人有更好的解决方案,请发布:)!
答案 1 :(得分:1)
您可以为.upload()
功能指定回调。例如:
req.file('media').upload(function (error, files) {
var file;
// Make sure upload succeeded.
if (error) {
return res.serverError('upload_failed', error);
}
// files is an array of files with the properties you want, like files[0].size
}
您可以在.upload()
的回调中调用适配器,并从那里上传文件。