我正在开发iOS应用程序,我需要将图像上传到AWS S3Bucket。我从服务器获得临时凭证(accessKey,secretKey,sessionToken和bucketName)以上传图像。
我发现很难确定使用此凭据上传图像的正确API。
使用AWSCognitoCredentialsProvider提供AWS示例程序。
我已经使用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类
AWSStaticCredentialsProvider 类仅接受 accessKey 和 secretKey 。其他2个类需要不同的参数。
当我使用带有accessKey和secretKey的AWSStaticCredentialsProvider上传图片时,我收到以下错误消息
上传失败:[错误域= NSURLErrorDomain Code = -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] error =>错误域= com.amazonaws.AWSS3ErrorDomain代码= 3“操作无法完成。(com.amazonaws.AWSS3ErrorDomain错误3.)”UserInfo = 0x7faea40171d0 {HostId = GeMapgMjrv43TZ4yFKmTjIw6EsZafbgk3GH9ATtbgIj1VpNNv6EjhmZhobHVm + / 2,Message =您提供的AWS访问密钥ID在我们的记录中不存在。,AWSAccessKeyId = ASIAIFYM7NXH3CSNXY3Q,Code = InvalidAccessKeyId,RequestId = 653371138733BE48}
答案 0 :(得分:5)
如果要使用服务器上生成的临时凭证,则需要实现自己的凭据提供程序。我建议采用以下方法:
AWSCredentialsProvider
实施您的凭据提供程序。请查看AWSWebIdentityCredentialsProvider
和AWSCognitoCredentialsProvider
的实现作为示例。此凭据提供程序应:
- refresh
时启动凭据刷新过程。我建议你看看Amazon Cognito Identity。借助Amazon Cognito,您可以使用公共登录提供商(如Amazon,Facebook,Google和任何OpenID Connect兼容提供商)或使用您自己的用户身份系统,创建用于访问AWS云服务的唯一最终用户标识符。它涵盖了许多自定义凭据提供程序用例,并且更易于使用和管理。