我正在使用iOS应用程序,需要将图像上传到AWS S3Bucket。我从服务器获取了临时证书(accessKey,secretKey,sessionToken和bucketName)以上传图像。

我发现很难找到正确的API来使用此凭据上传图像。

AWS示例程序是使用AWSCognitoCredentialsProvider给出的。

我有可以使用的Android版本代码,可以将图像上传到S3。但是我在iOS SDK中找不到相应的API。

 BasicSessionCredentials basiccredentials = new BasicSessionCredentials(
                            MY_ACCESS_KEY_ID, MY_SECRET_KEY,
                            MY_SESSION_TOKEN);
AmazonS3Client s3Client = new AmazonS3Client(
                            basiccredentials);
TransferManager manager = new TransferManager(s3Client);
PutObjectRequest por = new PutObjectRequest(Constants.getPictureBucket(), Constants.PICTURE_NAME,file name);
 manager.upload(por);

iOS SDK具有以下CredentialsProvider类
  • AWSCognitoCredentialsProvider
  • AWSStaticCredentialsProvider
  • AWSWebIdentityCredentialsProvider

  • AWSStaticCredentialsProvider 类仅接受 accessKey secretKey 。其他2个类别期望使用不同的参数。

    当我使用带有accessKey和secretKey的AWSStaticCredentialsProvider上载图像时,出现以下错误消息

    上传失败:[错误域= NSURLErrorDomain代码= -1017“无法解析
    响应” UserInfo = 0x7f8773f70ee0 {NSUnderlyingError = 0x7f8773f4bbb0
    “该操作无法完成。(kCFErrorDomainCFNetwork错误
    -1017。)“,NSErrorFailingURLStringKey = https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg
    NSErrorFailingURLKey = https://s3.amazonaws.com/playfiksprofilepictures/429bfd812ea08e706bab868f3cd8b9c6.jpg
    _kCFStreamErrorDomainKey = 4,_kCFStreamErrorCodeKey = -1,NSLocalizedDescription =无法解析响应}]

    不清楚此错误消息是凭据提供程序还是其他问题

    非常感谢您提供任何帮助来解决此问题

    谢谢

    编辑

    我使用了@ user3467204提供的示例程序

    这是带有错误消息的输出(您提供的AWS Access Key ID在我们的记录中不存在)。但是使用相同的键,android java代码可以正常工作。

    Android代码使用accessKey,secrectKey和sessionToken,但是iOS代码仅使用accessKey和secrectKey。

    2015-06-01 19:42:55.747 AWSV2Test [2191:170157]图像位于/ Users / jpsasi / Library / Developer / CoreSimulator / Devices / E846AC10-82BE-40AA-BB7E-29796A8FAD2B / data / Containers / Bundle / Application / B59E9032-306D-4609-97D6-6C516638463A / AWSV2Test.app / testimage.png
    2015-06-01 19:42:56.841 AWSV2Test [2191:170157]上传32677/35516字节
    2015-06-01 19:42:56.842 AWSV2Test [2191:170157]上传35516/35516字节
    2015-06-01 19:42:56.843 AWSV2Test [2191:170157]上传35516/35516字节
    2015-06-01 19:43:00.249 AWSV2Test [2191:170157]上传32677/35516字节
    2015-06-01 19:43:00.250 AWSV2Test [2191:170157]上传的35516/35516字节
    2015-06-01 19:43:00.251 AWSV2Test [2191:170157]上传35516/35516字节
    2015-06-01 19:43:02.848 AWSV2Test [2191:170157]上传32677/35516字节
    2015-06-01 19:43:02.849 AWSV2Test [2191:170157]上传35516/35516字节
    2015-06-01 19:43:02.850 AWSV2Test [2191:170157]上传35516/35516字节
    2015-06-01 19:43:05.285 AWSV2Test [2191:170157]上传32677/35516字节
    2015-06-01 19:43:05.286 AWSV2Test [2191:170157]上传35516/35516字节
    2015-06-01 19:43:05.287 AWSV2Test [2191:170157]上传35516/35516字节
    2015-06-01 19:43:06.681 AWSV2Test [2191:170157]错误=>错误域= com.amazonaws.AWSS3ErrorDomain代码= 3“操作无法完成。(com.amazonaws.AWSS3ErrorDomain错误3。) UserInfo = 0x7faea40171d0 {HostId = GeMapgMjrv43TZ4yFKmTjIw6EsZafbgk3GH9ATtbgIj1VpNNv6EjhmZhobHVm + / 2,Message =您提供的AWS Access Key ID在我们的记录中不存在。AWSAccessKeyId= 371,RequestIDId = 473

    最佳答案

    如果要使用在服务器上生成的临时凭据,则需要实现自己的凭据提供程序。我建议采用以下方法:

  • 在您的服务器上生成访问密钥,秘密密钥和 session token 。您有许多语言选项,包括Java,.NET,PHP,Ruby,Python和Node.js。
  • 通过遵循AWSCredentialsProvider来实现您的凭据提供程序。以AWSWebIdentityCredentialsProviderAWSCognitoCredentialsProvider的实现为例。该凭据提供者应:
  • 从服务器检索访问密钥,秘密密钥和 session 密钥。
  • 在本地保留它们,直到它们到期。
  • 根据要求返回凭据。
  • 如果它们已过期,请从服务器中重新获取它们。
  • 在调用- refresh时启动凭据刷新过程。

  • 我鼓励您看看Amazon Cognito Identity。借助Amazon Cognito,您可以通过使用 public 登录提供程序(例如Amazon,Facebook,Google和任何OpenID Connect兼容提供程序)或使用您自己的用户身份系统来创建用于访问AWS云服务的唯一最终用户标识符。它涵盖了许多自定义凭据提供程序用例,并且更易于使用和管理。

    09-25 19:54