当前位置: 首页 > 面试题库 >

如何使用GraphQL将图像上传到AWS S3?

傅和璧
2023-03-14
问题内容

我正在上传base64字符串,但GraphQL挂起了。如果我将字符串切成少于50,000个字符,它将起作用。50,000个字符后,graphQL永远不会进入解析函数,但不会给出错误。在较小的字符串上,它可以正常工作。

const file = e.target.files[0];
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onloadend = () => {
  const imageArray = reader.result;
  this.context.fetch('/graphql', {
    body: JSON.stringify({
      query: `mutation s3Upload($img: String!) {
        s3Upload(file: $img) {
          logo,
        }
      }`,
      variables: {
        img: imageArray,
      },
    }),
  }).then(response => response.json())
  .then(({ data }) => {
    console.log(data);
  });
}

const s3Upload = {
    type: S3Type,
    args: {
      file: { type: new NonNull(StringType) },
    },
    resolve: (root, args, { user }) => upload(root, args, user),
};

const S3Type = new ObjectType({
  name: 'S3',
  fields: {
    logo: { type: StringType },
  },
});

问题答案:

此处的正确方法是使用AWS AppSync通过复杂类型执行实际的S3上传-
您在此处说明的内容看起来更像是您尝试将base64编码的图像作为字符串保存到字段中,我只能假定是DynamoDB表条目。但是,要使此方法起作用,您需要修改您的突变,以使该file字段不是String!,而是一个S3ObjectInput

您需要在引擎盖下有一些活动部件,以确保在此“有效”(TM)之前就位。首先,您需要确保在GraphQL模式中定义的S3对象具有适当的输入和类型

enum Visibility {
    public
    private
}

input S3ObjectInput {
    bucket: String!
    region: String!
    localUri: String
    visibility: Visibility
    key: String
    mimeType: String
}

type S3Object {
    bucket: String!
    region: String!
    key: String!
}

S3ObjectInput通过创建或更新在其中所述S3对象元数据被嵌入到一个模型的方式-型,当然,在上传新文件时是使用。可以通过以下方法在突变的请求解析器中进行处理:

{
    "version": "2017-02-28",
    "operation": "PutItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.input.id),
    },

    #set( $attribs = $util.dynamodb.toMapValues($ctx.args.input) )
    #set( $file = $ctx.args.input.file )
    #set( $attribs.file = $util.dynamodb.toS3Object($file.key, $file.bucket, $file.region, $file.version) )

    "attributeValues": $util.toJson($attribs)
}

这是假设S3文件对象是附加到DynamoDB数据源的模型的子字段。请注意,用于$utils.dynamodb.toS3Object()建立复杂S3对象的调用file,该对象是类型为的模型字段S3ObjectInput。以这种方式设置请求解析器可以处理文件到S3的上载(所有凭据都正确设置后,我们稍后再讨论),但是它没有解决如何S3Object找回。这是附加到本地数据源的字段级别解析器的地方。本质上,您需要在AppSync中创建本地数据源,并file使用以下请求和响应解析器将其连接到架构中的模型字段:

## Request Resolver ##
{
    "version": "2017-02-28",
    "payload": {}
}

## Response Resolver ##
$util.toJson($util.dynamodb.fromS3ObjectJson($context.source.file))

此解析器仅告诉AppSync我们要获取DynamoDB中存储的用于file模型字段的JSON字符串,并将其解析为S3Object-这样,当您执行模型查询时,而不是返回存储在模型中的字符串。file现场,你会得到包含的对象bucketregionkey属性,你可以使用它们来构建URL访问的S3对象(直接通过S3无论是或使用CDN
-这真的取决于您的配置)。

但是,请确保已为复杂对象设置了凭据(告诉您,我会回到此话题)。我将使用一个React示例来说明这一点-
定义AppSync参数(端点,auth等)时,complexObjectCredentials需要定义一个附加属性,以告诉客户端使用什么AWS凭证来处理S3上传,例如:

const client = new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {
        type: AUTH_TYPE.AWS_IAM,
        credentials: () => Auth.currentCredentials()
    },
    complexObjectsCredentials: () => Auth.currentCredentials(),
});

假定所有这些条件都已就绪,则可以通过AppSync上传和下载S3。



 类似资料:
  • 我已经为KeystoneJS的AdminUI编写了一个自定义字段,它使用了TinyMCE的编辑器。 KeystoneJS在下面运行Apollo GraphQL服务器,并根据CMS模式自动生成变化和查询。TinyMCE具有输入自定义挂钩以上载图像的功能。 我希望能够连接这两个——使用GraphQL将图像从TinyMCE上传到KeystoneJS的服务器。 例如,在我的设置中,我在CMS中有一个字段。

  • 问题内容: 我目前正在使用 http://paperjs.org 创建HTML5画布绘图应用程序。我想让用户将图像上传到画布中。我知道我需要进行登录和注册,但是有更简单的方法吗?我已经看到HTML5拖放式上传。 问题答案: 我假设您的意思是将图像加载到画布中,而不是从画布上载图像。 在这里阅读他们所有的画布文章可能是一个好主意 但基本上,您要做的是在javascript中创建图片,然后将image

  • 如何使用java将图像上传到wordpress API?restapi的路径是wp-json/wp/v2/media

  • 问题内容: 我有一个图像,我想使用Volley库将该图像上传到我的Web服务,问题是我正在寻找一种方法,但仍然没有找到。 我找到了,但是对我不起作用:http : //develop-for- android.blogspot.com.br/2014/01/using-volley-in-your- application.html 我怎样才能做到这一点 ? 我正在尝试这个。 问题答案: 我对排球

  • 问题内容: 我正在尝试从HTML表单中将图像保存在数据库中。我已经编写了PHP代码来完成此任务。该程序不会生成任何错误消息,而且不会在MySQL数据库中插入图像数据。请检查一下。在这里,我分享了我的代码的摘录。 错误消息您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’‘附近使用正确的语法 问题答案: 首先,您应该检查 图像列是否为BLOB类型 ! 我对您的SQL表一无