代码之家  ›  专栏  ›  技术社区  ›  srghma

如何在hasura graphql引擎上上传文件或图像

  •  4
  • srghma  · 技术社区  · 7 年前

    例子:

    如何实施?

    1 回复  |  直到 7 年前
        1
  •  9
  •   srghma    7 年前

    • 客户机上传到s3(或类似的服务),get的文件url,然后对正确的表进行insert/update变异
    • 自定义上载程序-编写应用程序/服务器,用于上载文件和修改数据库,并使用nginx路由将一些请求重定向到数据库
    • 使用模式缝合的自定义解析器( example )
        2
  •  0
  •   Howard    5 年前

    如果要将文件上载到awss3,有一种简单的方法,即不必启动另一个服务器来处理文件上载或创建hasura操作的处理程序。

    基本上,当您将文件上载到S3时,最好从后端获取签名的url并直接上载到S3。顺便说一句,对于多个图像大小的主机, this approach


    在node.js中,您可以

    const AWS = require("aws-sdk");
    const s3 = new AWS.S3({ apiVersion: "2006-03-01" });
    const signedUrl = s3.getSignedUrl("putObject", {
      Bucket: "my-bucket",
      Key: "path/to/file.jpg",
      Expires: 600,
    });
    console.log("signedUrl", signedUrl);
    

    一个signedUrl示例如下 https://my-bucket.s3.amazonaws.com/path/to/file.jpg?AWSAccessKeyId=AKISE362FGWH263SG&Expires=1621134177&Signature=oa%2FeRF36DSfgYwFdC%2BRVrs3sAnGA%3D
    通常,您会将上述代码放到AWS Lambda或glitch中托管的处理程序中,并添加一些授权逻辑,甚至向表中添加一行。

    你可以看到最重要的部分是 Signature=oa%2FeRF36DSfgYwFdC%2BRVrs3sAnGA%3D

    在深入研究AWS-JS-SDK之后,我们可以发现签名是计算出来的 here

    return util.crypto.lib.createHmac(fn, key).update(string).digest(digest);
    
    fn = 'sha1'
    string = 'PUT\n\n\n1621135558\b/my-bucket/path/to/file.jpg'
    digest = 'base64'
    

    它只是一个特定格式的字符串。这意味着我们可以使用hasura计算字段和Postgres加密函数来实现相同的结果。

    所以如果你有一张“文件”表

    CREATE TABLE files (
       id SERIAL,
       created_at timestamps,
       filename text,
       user_id integer
    );
    

    CREATE OR REPLACE FUNCTION public.file_signed_url(file_row files)
     RETURNS text
     LANGUAGE sql
     STABLE
    AS $function$
      SELECT ENCODE( HMAC(
      
      'PUT' ||E'\n'||E'\n'||E'\n'|| 
      (cast(extract(epoch from file_row.created_at) as integer) + 600)
      ||E'\n'|| '/my-bucket/' || file_row.filename
      
      , 'AWS_SECRET', 'SHA1'), 'BASE64')
    $function$
    

    最后,跟随 this 向Hasura公开这个计算字段。

    推荐文章