从loopback-component-storage验证并重命名映像文件

时间:2016-05-15 12:39:28

标签: upload storage loopbackjs file-type

我得到的问题与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
    }
});

以下是要求:

  1. 验证文件的文件类型
  2. 修改服务器中保存的名称
  3. 拒绝文件或用户名无效
  4. 以下是我使用和遇到的一些参考资料:

    • 用户名是必需的,因此它应该是用户的方法。我添加了一个类似于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"这个意外的结果可能会阻碍文件类型的判断。

1 个答案:

答案 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();
  }
});

我希望这可以帮助你找到你想要的方式。