10

AWSは初めてで、iOSアプリに使用しています。

iOSアプリから「img.haraj.com.sa」という名前のバケットに画像をアップロードしようとしています。画像をアップロードすると、バケットに表示されません。しかし、ターゲットを「haraj」という名前のバケットに変更すると、それらがアップロードされ、バケットに表示されます。

ポリシーは次のとおりです。

{
  "Statement": [
    {
      "Sid": "**********hidden**********",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
       "arn:aws:s3:::haraj/*"
      ]
    }
  ]
}

ターゲットバケットを変更するためにこれを変更します。また、「img1.haraj.com.sa」という名前で他のバケットを作成し、画像をアップロードしようとしましたが、残念ながらそれらも失敗しました。

ドット(。)とドットのないバケット名には問題があるようです。ドットのないバケットの名前はiOSアプリで機能し、ドットのある名前は機能しません。でもわかりません。しかし、私はこの問題に直面しています。アプリコードでエラー応答を受け取りません。

これが私のiOSアプリ実装の一部です:

- (void)postAdButtonPushed:(id)sender
{
    DLog(@"Post Ad")

    AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:AWS_ACCESS_KEY_ID withSecretKey:AWS_SECRET_KEY];
    s3Client.timeout = 240;

    NSString *bucketName = [NSString stringWithFormat:@"img.haraj.com.sa"];
    NSString *imageName = [NSString stringWithFormat:@"testimage.jpg"];

    S3PutObjectRequest *objReq = [[S3PutObjectRequest alloc] initWithKey:imageName inBucket:bucketName];
    objReq.contentType = @"image/jpeg";

    UIImage *testImageToUpload = [self.imagesToUpload objectAtIndex:0];

    NSData *imageData = UIImageJPEGRepresentation(testImageToUpload, 0.8);
    objReq.data = imageData;
    objReq.delegate = self;

    objReq.contentLength = [imageData length];

    [s3Client putObject:objReq];
}

- (void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response
{
    DLog(@"response: %@", response.description)
}

- (void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error
{
    DLog(@"Req failed: %@", error.description)
}

また、Amazonフォーラムでスレッドを作成しました:AWSバケットiOSアプリへの画像のアップロード

どんな助けでもいただければ幸いです。ありがとうございました!

4

3 に答える 3

6

フォーラムスレッドへの回答をここに投稿しましたが、要約すると、SDKのバグに遭遇したため、バケットが配置されているS3エンドポイントを明示的に設定する必要があると思います。

于 2013-02-25T17:55:09.607 に答える
6

量り込みたかったのですが、これが私が機能するようになったコードスニペットです

// #import <AWSS3/AWSS3.h>
// #import <AWSRuntime/AWSRuntime.h>
// then you should implement <AmazonServiceRequestDelegate>
// import those in your .h file and
// add the awss3 and awsruntime framework from the client
// download from Amazon
// myFace is the UIImage object

    AmazonS3Client *s3Client = [[AmazonS3Client alloc] initWithAccessKey:@"Key_Goes_here" withSecretKey:@"Secret_Goes_Here"];

    NSString *imageName = [NSString stringWithFormat:@"%@.png", @"cpa"];

    S3PutObjectRequest *objReq = [[S3PutObjectRequest alloc] initWithKey:imageName inBucket:@"bucket_name"];
    objReq.contentType = @"image/png";
    objReq.cannedACL   = [S3CannedACL publicRead];
    objReq.data = UIImagePNGRepresentation(myFace);
    objReq.delegate = self;

    [s3Client putObject:objReq];

デリゲートメソッドは次のとおりです。

-(void)request:(AmazonServiceRequest *)request didSendData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten totalBytesExpectedToWrite:(long long)totalBytesExpectedToWrite {
}

-(void)request:(AmazonServiceRequest *)request didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"response! %@", response);
}

-(void)request:(AmazonServiceRequest *)request didCompleteWithResponse:(AmazonServiceResponse *)response {

}

-(void)request:(AmazonServiceRequest *)request didReceiveData:(NSData *)data {
    NSLog(@"data?");
}

-(void)request:(AmazonServiceRequest *)request didFailWithError:(NSError *)error {
    [self showAlertMessage:[error.userInfo objectForKey:@"message"] withTitle:@"Upload Error"];
}
于 2014-01-03T00:44:49.783 に答える
0

パブリックアクセスを許可したくない場合は、IAMでユーザーを定義し、次のコードをバケットポリシーに含める必要があります。

{
  "Version": "2012-10-17",
  "Id": "S3AccessPolicy",
  "Statement": [
    {
      "Sid": "GiveGetPutAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/YOUR_USER"
      },
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::YOUR_BUCKET/*"
    }
  ]
}
于 2019-02-27T06:38:35.773 に答える