2017-02-02 1 views
0

포인트 : 나는 iOS 앱은 이미지 업로드는 상태 코드 400 매번 아이폰 OS를 제공

  • 이제 문제는 내가 내에서 아마존 PreSigned URL을 사용하여 이미지를 업로드 일하고

    • 업로드 할 때마다 상태 코드 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를 같은 비슷한 방법을 구현해야합니다.

  • +0

    한 가지 질문 : Amazon의 SDK를 사용하는 이유는 무엇입니까? http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3-pre-signed-urls.html? –

    +0

    @AndreasOetjen 사실, 미리 서명 된 URL은 서버 사이드 코딩에서 생성됩니다. 클라이언트가 하나의 API를 통해 제공하므로 여기에서 업로드 파일로 사용해야합니다. 따라서 프로세스의 절반이 서버 측에 있다고 말할 수 있습니다. – Mayur

    +0

    저는 HTTP 프로토콜의 전문가는 아니지만 접근 방법에 몇 가지 문제가 있습니다. 우선 경계 : HTTP 헤더에서 어디에 지정합니까? (공동 발생으로) 일부 데이터에 경계 문자열 만 있으면 어떻게됩니까? 따라서 SDK를 사용하여 다시 작성해야합니다. SDK를 사용할 수 없어야하는 이유는 확실하지 않지만 URL은 서버 측에서 생성되지만 클라이언트 측에서 사용됩니다. –

    답변

    2

    마지막으로 요청 매개 변수 형식을 변경하여 문제를 해결했습니다. 아래는 작업 코드입니다.

    - (void)doUploadURL { 
        UIImage *myimage = [UIImage imageNamed:@"testimage.png"]; 
        NSData *imageData = UIImagePNGRepresentation(myimage); 
    
        NSString *boundary = @"------VohpleBoundary4QuqLuM1cE5lMwCy"; 
        NSMutableData *body = [NSMutableData data]; 
    
        //Populate a dictionary with all the regular values you would like to send. 
        NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; 
        [parameters setValue:strAcL forKey:@"acl"]; 
        [parameters setValue:strContentType forKey:@"Content-Type"]; 
        [parameters setValue:strKey forKey:@"key"]; 
        [parameters setValue:strMetaFilename forKey:@"x-amz-meta-filename"]; 
        [parameters setValue:strCredential forKey:@"X-Amz-Credential"]; 
        [parameters setValue:strAlgorithm forKey:@"X-Amz-Algorithm"]; 
        [parameters setValue:strAmzDate forKey:@"X-Amz-Date"]; 
        [parameters setValue:strPolicy forKey:@"Policy"]; 
        [parameters setValue:strSignature forKey:@"X-Amz-Signature"]; 
    
        // add params (all params are strings) 
        for (NSString *param in parameters) { 
         [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
         [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]]; 
         [body appendData:[[NSString stringWithFormat:@"%@\r\n", [parameters objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]]; 
        } 
    
        // Upload image 
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"testimage.png\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
        [body appendData:[@"Content-Type:image/png\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
        [body appendData:imageData]; 
        [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    
        //Close off the request with the boundary 
        [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"APIURL"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:3600.0]; 
        [request setHTTPMethod:@"POST"]; 
    
        // set Content-Type in HTTP header 
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
        [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 
    
        [request setHTTPBody:body]; 
    
        NSURLSession *session = [NSURLSession sharedSession]; 
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
    
         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]; 
    } 
    

    누군가를 안내하는 데 도움이되기를 바랍니다.