gpt4 book ai didi

amazon-s3 - 如何使用 AWS AppSync 将文件上传到 AWS S3

转载 作者:行者123 更新时间:2023-12-03 13:30:14 24 4
gpt4 key购买 nike

关注 this docs/tutorial在 AWS AppSync 文档中。

它指出:

With AWS AppSync you can model these as GraphQL types. If any of your mutations have a variable with bucket, key, region, mimeType and localUri fields, the SDK will upload the file to Amazon S3 for you.



但是,我无法让我的文件上传到我的 s3 存储桶。我知道该教程缺少很多细节。更具体地说,教程没有说 NewPostMutation.js需要改变。

我通过以下方式更改了它:
import gql from 'graphql-tag';

export default gql`
mutation AddPostMutation($author: String!, $title: String!, $url: String!, $content: String!, $file: S3ObjectInput ) {
addPost(
author: $author
title: $title
url: $url
content: $content
file: $file
){
__typename
id
author
title
url
content
version
}
}
`

然而,即使在我实现了这些更改之后,文件也没有上传......

最佳答案

在这个“正常工作”(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 中的 JSON 字符串用于 file。模型的字段并将其解析为 S3Object - 这样,当您查询模型时,而不是返回存储在 file 中的字符串字段,你会得到一个包含 bucket 的对象, region , 和 key可用于构建 URL 以访问 S3 对象的属性(直接通过 S3 或使用 CDN - 这实际上取决于您的配置)。

但是,请确保您为复杂对象设置了凭据(告诉您我会回到这个问题上)。我将使用一个 React 示例来说明这一点 - 在定义 AppSync 参数(端点、身份验证等)时,还有一个名为 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 上传和下载应该可以工作。

关于amazon-s3 - 如何使用 AWS AppSync 将文件上传到 AWS S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48495338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com