【问题标题】:Validate and Rename Image file from loopback-component-storage验证和重命名来自 loopback-component-storage 的图像文件
【发布时间】:2016-05-17 17:44:33
【问题描述】:

我收到了与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. 如果文件或用户名无效则拒绝

这是我使用和遇到的一些参考:

  • 用户名是必填项,所以应该是用户的方法。我添加了一个远程方法,就像在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"这个意想不到的结果可能会妨碍文件类型的判断。

【问题讨论】:

    标签: upload storage loopbackjs file-type


    【解决方案1】:

    这是我为验证文件类型和修改文件名所做的,

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

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

    【讨论】:

    • 是的,您可以自定义远程方法。我相信内容类型应该没问题。
    • 谢谢。但是 allowedContentTypes 仍然无法解决application/octet-stream 的问题。我发现发送文件时应该定义MINI类型的原因。顺便说一句,beforeRemote 的方法应该是上传而不是创建。
    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2015-05-20
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多