0
포인트 : 나는 iOS 앱은 이미지 업로드는 상태 코드 400 매번 아이폰 OS를 제공
- 업로드 할 때마다 상태 코드 400을 받음
- 잘 작동하는 경우 상태 코드가 20434가되어야합니다.
- 사전 서명 된 URL은 우체부에서 테스트하는 동안 잘 작동하지만 앱 측에서는 작동하지 않습니다.
- (void)doUploadURL { UIImage *myimage = [UIImage imageNamed:@"testimage.png"]; NSData *imageData = UIImagePNGRepresentation(myimage); NSString *boundary = @"---011000010111000001101001"; NSMutableData *body = [NSMutableData data]; // AcL parameter [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"acl\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strAcL dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // Content-Type parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strContentType dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // key parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"key\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strKey dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // x-amz-meta-filename parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"x-amz-meta-filename\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strMetaFilename dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // X-Amz-Credential parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"X-Amz-Credential\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strCredential dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // X-Amz-Algorithm parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"X-Amz-Algorithm\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strAlgorithm dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // X-Amz-Date parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"X-Amz-Date\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strAmzDate dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // Policy parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Policy\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strPolicy dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // X-Amz-Signature parameter [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"X-Amz-Signature\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[strSignature dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // file [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: attachment; name=\"file\"; filename=\"testimage.png\"\\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageData]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; NSDictionary *headers = @{ @"content-type": @"multipart/form-data"}; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://visual-showcase.s3-ap-southeast-2.amazonaws.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:3600.0]; [request setHTTPMethod:@"POST"]; [request setAllHTTPHeaderFields:headers]; [request setHTTPBody:body]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; NSLog(@" Final Response : %d",httpResponse.statusCode); if (error) { NSLog(@"Error : %@", error); dispatch_async(dispatch_get_main_queue(), ^{ [[[UIAlertView alloc] initWithTitle:@"Alert" message:@"Failed to upload" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] show]; return; }); } else { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; NSError *err = nil; NSDictionary *responseDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&err]; } }]; [dataTask resume]; }
응답 코드 :
<NSHTTPURLResponse: 0x7d10e2c0> { status code: 400, headers { Connection = close; "Content-Type" = "application/xml"; Date = "Thu, 02 Feb 2017 07:20:18 GMT"; Server = AmazonS3; "Transfer-Encoding" = Identity; "x-amz-id-2" = "HIFhwBaj/ejjGoCgD2vacG2AtoxEFDXxSr6eulZtzUbuLoTcLT+AA9k6093Jyv5OIuK2wpi7+9c="; "x-amz-request-id" = C221CD8DA2D80BCD; } }
질문 :
-
다음
는 구현 0 - 제 질문은 Amazon 사전 서명 URL을 사용하여 파일을 업로드하는 동안 설정해야 할 것이 있습니까? 아니면 일반적인 API 호출처럼 구현할 수 있습니까?
- 내 지식 & 당으로는
- 내게 어떤 힌트를 얻거나 뭔가 잘못된 경우 내가 요구 포맷에 미리
감사를하고있는 중이 야 할 마십시오 일반 API를 같은 비슷한 방법을 구현해야합니다.
한 가지 질문 : Amazon의 SDK를 사용하는 이유는 무엇입니까? http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3-pre-signed-urls.html? –
@AndreasOetjen 사실, 미리 서명 된 URL은 서버 사이드 코딩에서 생성됩니다. 클라이언트가 하나의 API를 통해 제공하므로 여기에서 업로드 파일로 사용해야합니다. 따라서 프로세스의 절반이 서버 측에 있다고 말할 수 있습니다. – Mayur
저는 HTTP 프로토콜의 전문가는 아니지만 접근 방법에 몇 가지 문제가 있습니다. 우선 경계 : HTTP 헤더에서 어디에 지정합니까? (공동 발생으로) 일부 데이터에 경계 문자열 만 있으면 어떻게됩니까? 따라서 SDK를 사용하여 다시 작성해야합니다. SDK를 사용할 수 없어야하는 이유는 확실하지 않지만 URL은 서버 측에서 생성되지만 클라이언트 측에서 사용됩니다. –