繁体   English   中英

AWSS3GetPreSignedURLRequest上传,自定义标题为403

AWSS3GetPreSignedURLRequest upload with custom headers giving 403

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我的AWSS3GetPreSignedURLRequest和AFNetworking的NSMutableURLRequest遇到了一些问题。 我可以使用Content-Type标头成功上传文件。 但是,如果我添加x-amz-aclx-amz-server-side-encryption ,则上传将失败,并显示403 - No Permission错误。 我能做什么? 这是亚马逊方面的问题,使用服务器端加密或ACL不允许使用预先签名的URL,或者更改请求是否有效? 我对AWS文档和iOS SDK参考资料非常深入,但没有任何内容。 顺便说一句,我正在使用AWS iOS SDK v2。 有人怎么怎么做?

    NSString *keyName;
    NSString *fileContentTypeStr;
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM.d.h.mm.ss"];
    if([multipleFileType isEqualToString:@"PNG"])
    {
        fileContentTypeStr = @"image/png";
        keyName = [NSString stringWithFormat:@"image_%@.png", [formatter stringFromDate:[NSDate date]]];
    }
    else if([multipleFileType isEqualToString:@"JPG"])
    {
        fileContentTypeStr = @"image/jpeg";
        keyName = [NSString stringWithFormat:@"image_%@.jpg", [formatter stringFromDate:[NSDate date]]];
    }
    self.imageUploadURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"image"]];

    [imageData writeToURL:self.imageUploadURL atomically:YES];
    AWSS3GetPreSignedURLRequest *getPreSignedURLRequest = [AWSS3GetPreSignedURLRequest new];
    getPreSignedURLRequest.bucket = [NSString stringWithFormat:@"BUCKET-NAME/%@",  folderObject.objectId];
    getPreSignedURLRequest.key = keyName;
    getPreSignedURLRequest.HTTPMethod = AWSHTTPMethodPUT;
    getPreSignedURLRequest.expires = [NSDate dateWithTimeIntervalSinceNow:3600];
    getPreSignedURLRequest.contentType = fileContentTypeStr;

    [[[AWSS3PreSignedURLBuilder defaultS3PreSignedURLBuilder] getPreSignedURL:getPreSignedURLRequest]
     continueWithBlock:^id(BFTask *task) {
         if (task.error) {
             NSLog(@"Error: %@",task.error);
         } else {
             NSURL *presignedURL = task.result;
             NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:presignedURL];
             [URLRequest setValue:fileContentTypeStr forHTTPHeaderField:@"Content-Type"];
             [URLRequest setValue:@"AES-256" forHTTPHeaderField:@"x-amz-server-side-encryption"];
             [URLRequest setValue:@"private" forHTTPHeaderField:@"x-amz-acl"];
             URLRequest.HTTPMethod = @"PUT";
             URLRequest.HTTPBody = imageData;

             AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
             NSProgress *progress;
             NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:URLRequest progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
             if(!error){
             NSLog(@"File was successfully uploaded.");
             }
             }];
             [uploadTask resume];
         }
         return nil;
     }];

注意:那里的代码示例缺少全局标题上的一些内容,还有一些其他完成块+委托,但我相信每个人都会明白这一点。

期待的感谢,

2 个回复

正如@YosukeMatsuda在评论中注意到的那样,您可以使用putObjectAcl:方法。

我把上传对象的ACL放在URLSession didCompleteWithError:委托方法上,如下所示:

//
self.awss3 = [[AWSS3 alloc] initWithConfiguration:__your_config__];
//

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    if (error)
    {
        NSLog(@"S3 UploadTask: %@ completed with error: %@", task, [error localizedDescription]);
    }
    else
    {
//      AWSS3GetPreSignedURLRequest does not contain ACL property, so it has to be set after file was uploaded to bucket
        AWSS3PutObjectAclRequest *aclRequest = [AWSS3PutObjectAclRequest new];
        aclRequest.bucket = @"your_bucket";
        aclRequest.key = @"your_key";
        aclRequest.ACL = AWSS3ObjectCannedACLPublicRead;

        [[self.awss3 putObjectAcl:aclRequest] continueWithBlock:^id(BFTask *bftask) {
            if (bftask.error)
            {
                NSLog(@"Error putObjectAcl: %@", [bftask.error localizedDescription]);
            }
            else
            {
                AWSEndpoint *endpoint =  self.awss3.configuration.endpoint;
                NSURL *publicReadURL = [[endpoint.URL URLByAppendingPathComponent:backgroundUploadTask.bucket] URLByAppendingPathComponent:backgroundUploadTask.key];
            }
            return nil;
        }];
    }
}

我们添加了- setValue:forRequestParameter: to AWSS3GetPreSignedURLRequest 您可以使用此方法添加ACL和加密标头。

此外,我们还推出了新的AWSS3TransferUtility以简化后台传输。 有关更多详细信息,请参阅我们的博文

4 ActionBar自定义标题为ImaveView而不是TextView

我试图在动作栏上解决这个问题,但从我可以看到的标题基本上是一个TextView,但我需要放置一个图像而不是纯文本。 我尝试将其设置为Style themes.xml,如下所示: 然后我定义了这种风格 我认为我可以为标题定义背景,但即使我做的不是我想要的,也可以试试getActi ...

5 自定义URL主题为Drupal

我们在Drupal上写了网站。 我们想进行Nginx缓存,但是遇到了一个问题。 Nginx缓存可以完美地工作,但是如果用户A会转到页面http://domain.com并对其进行缓存。 用户B使用移动主题http://domain.com/?theme=mobile并转到http: ...

6 主题为自定义UIActivity

如何指定自定义UIActivity支持主题? UIActivityItemSource协议的文档提到您可以实现可选的activityViewController:subjectForActivityType: selector,如果您希望源代码提供主题: 发布项目时,服务可以提供 ...

8 添加自定义标题以上传图片

我目前正在尝试将CKeditor 5 ReactComponent集成到我的应用程序中。 我面临上传图像功能的问题...我使用的是Node / Express后端,该后端使用JWT auth中间件,因此每个请求都必须具有一个Authorization标头才能通过。 我想知道以下情况之 ...

10 使用Facebook PHP SDK上传图片时自定义图片标题?

我有一个Facebook应用程序,允许用户将图片从我的网站上传到我的Facebook页面。 我想知道谁上传了这些图片,经过一番研究,我设法得到了以下PHP代码: 不幸的是,我的输出应该是亚当·史密斯 ( Adam Smith)的爱情婚姻 ,我得到的唯一输出是爱情婚姻 。 我如何获 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM