0

我目前在我的应用程序中使用 Mobile Hub。当我尝试使用 S3 将照片上传到我的存储桶时,我逐字复制了此处文档中的功能以下载/上传文件:https ://docs.aws.amazon.com/aws-mobile/latest/developerguide/add- aws-mobile-user-data-storage.html

这是我在 Swift 中尝试使用 S3TransferUtility 的代码:

func uploadData(data: Data, fileName: String) {

let expression = AWSS3TransferUtilityUploadExpression()
expression.progressBlock = {(task, progress) in
    DispatchQueue.main.async(execute: {
        // Do something e.g. Update a progress bar.
    })
}

var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
completionHandler = { (task, error) -> Void in
    DispatchQueue.main.async(execute: {
        // Do something e.g. Alert a user for transfer completion.
        // On failed uploads, `error` contains the error object.
    })
}

let transferUtility = AWSS3TransferUtility.default()

transferUtility.uploadData(data,
                           bucket: "my bucket name",
                           key: fileName,
                           contentType: "image/jpeg",
                           expression: expression,
                           completionHandler: completionHandler).continueWith {
                            (task) -> AnyObject? in
                            if let error = task.error {
                                print("Error: \(error.localizedDescription)")
                            }

                            if let res = task.result {
                                // Do something with uploadTask.
                                print(res)
                            }
                            return nil
}
}

我在控制台中收到此错误:控制台 中的错误图像

我调查了 AWS S3 和提供的 awsconfiguration.json 文件,一切似乎都井井有条:

AWS IAM 控制台

我项目中的 AWSConfiguration.json 文件

现在我很困惑,因为我认为 Mobile Hub 应该负责 IAM 配置,而不是处理所有事情。

有人可以指出我正确的方向来解决这个问题吗?谢谢你。

4

3 回答 3

1

AWS Mobile Hub 在您的 S3 存储桶中创建以下文件夹。每个文件夹在 IAM 中都具有基于应用程序用户的 Cognito 身份验证状态的预配置权限。

  • 上市

    任何经过身份验证的用户都可以读取或写入此文件夹

  • 私人的

    经过身份验证的用户只能从他们的文件夹中读取或写入(例如 private/{identityId})

  • 受保护

    任何经过身份验证的用户都可以读取,但只有所有者可以写入他们的文件夹(例如 protected/{identityId})

  • 上传

    任何经过身份验证的用户都可以写入,但只有所有者可以读取此文件夹中的内容

这个先前的答案也可能会有所帮助:如何使用 AWS 移动中心创建的 s3 存储桶从 Swift 将文件上传到受保护的 s3 存储桶中?

于 2018-08-02T18:57:42.680 回答
0

好的,我遇到了同样的错误,并一直在思考为什么我应该公开存储桶来摆脱这个错误。然后我意识到我犯了一种愚蠢的错误。当我通过 Amplify CLI ($amplify add storage) 添加这个存储时,有一个选项要求“Auth users”或“Auth & Guest”。之后有一些选择,例如

  1. 创建/更新
  2. 删除

我只选择了选项 1,创建/更新,假设所有可以创建的用户仍然可以看到。这就是错误。我需要同时选择选项 1 和 2。现在哪种有意义。

我不得不删除我的存储并重新添加以调试它。然后它也开始用于下载和上传。请记住公共的、受保护的文件夹也很重要。

希望这可以帮助有同样问题的人。

于 2020-05-02T15:10:33.963 回答
0

该解决方案与 Mobile Hub 自动执行的存储桶的设置以及前端的一些代码有关。

从前端开始,您需要手动配置您的凭证,如下所示: //Setup credentials let credentialsProvider = AWSMobileClient.sharedInstance().getCredentialsProvider()

//Setup the service configuration
let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider)

//Setup the transfer utility configuration
let tuConf = AWSS3TransferUtilityConfiguration()
tuConf.isAccelerateModeEnabled = false


//Register a transfer utility object
AWSS3TransferUtility.register(
    with: configuration!,
    transferUtilityConfiguration: tuConf,
    forKey: "transfer-utility-with-advanced-options"
)


//Look up the transfer utility object from the registry to use for your transfers.
let transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: "transfer-utility-with-advanced-options")

内容类型也应该是 image/png。

最后,当使用移动集线器时,您的存储桶内会创建四个初始文件夹。您必须指定要将内容上传到哪个文件夹。到目前为止,我只能上传到公众。您可以在函数uploadData 中的“key”参数下指定此项。

在浏览存储桶时,在私有文件夹和受保护文件夹中有一个自述文件,上面写着“将为该目录中的每个用户生成文件夹。移动应用程序用户只能在自己的子文件夹中上传、下载和列出文件。”,但文件夹是空的,我不知道如何使用这些文件夹。有人可以帮我解决这个问题吗?谢谢

于 2018-07-31T21:03:39.040 回答