我得到的问题与Modify image obtained from loopback-component-storage类似,但答案对我来说并不理想。
使用相同的示例:
在客户端
Upload.upload(
{
url: '/api/containers/container_name/upload',
file: file,
fileName: "demoImage.jpg",
//Additional data with file
params:{
username : username
}
});
以下是要求:
以下是我使用和遇到的一些参考资料:
用户名是必需的,因此它应该是用户的方法。我添加了一个类似于https://stackoverflow.com/a/31118294/5241407的远程方法,并将api更改为/ api / usermodel /:id / upload。在remoteMethod中添加了一些代码以将用户名发送到container.upload
函数。我们是否可以在此阶段验证文件类型并更改文件名,以便在无效时返回错误?
我在启动文件中使用了configure-storage.js,因为它在https://stackoverflow.com/a/31059880/5241407但是这个解决方案是不合适的。如果客户端发送无效的文件类型,服务器将抛出错误,这是不期望的。最好使用错误响应拒绝查询,而不是抛出系统错误。那么如何在不抛出系统级错误的情况下返回错误呢?
上传png文件并检查configure-storage.js中的file.type后,发现文件类型为application / octet-stream而不是image / png。这是我用来探测的代码:curl -X POST --header "Content-Type: multipart/form-data" --header "Accept: application/json" "HOST/api/usermodel/userId/upload" -F "filename=@a.png"
这个意外的结果可能会阻碍文件类型的判断。
答案 0 :(得分:4)
这是我为验证文件类型和修改文件名所做的工作,
datasources.local.js
中的 [容器名称为container
]
module.exports = {
container: {
root: './upload',
acl: 'public-read',
allowedContentTypes: ['image/jpg', 'image/jpeg', 'image/png', 'image/tiff'],
maxFileSize: 10 * 1024 * 1024,
getFilename: function(fileInfo) {
var fileName = fileInfo.name.replace(/\s+/g, '-').toLowerCase();
return 'image-' + new Date().getTime() + '-' + fileName;
}
}
};
请求的拒绝应通过ACL进行身份验证和授权检查。基于文件名的拒绝可以通过远程钩子完成。
以下是一个示例(我没有对此进行测试)
Container.beforeRemote('create', function(context, comment, next) {
if (context.req.body.fileName.length < 7) {
context.res.statusCode = 401;
next(new Error('Filename is too short!'));
} else {
next();
}
});
我希望这可以帮助你找到你想要的方式。