2017-02-02 4 views
0

Point:Télécharger l'image en utilisant Amazon PreSigned URL donne le code d'état 400 à chaque fois iOS

  • Je travaille sur le téléchargement de l'image à l'aide Amazon URL PreSigned dans mon iOS App
  • Maintenant la question est que je suis obtenir le code d'état 400 chaque fois que je le télécharge
  • Il devrait donner le code d'état 204 s'il fonctionne bien
  • L'URL pré-signée fonctionne bien lors des tests sur Postman mais ne fonctionne pas du côté de l'application.

Voici la mise en œuvre:

- (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]; 
} 

Code de réponse:

<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; 
} } 

Question:

  • Ma question est, y a-t-il quelque chose que nous devons définir lors du téléchargement de fichiers en utilisant Amazon pré-signé URL? Ou pouvons-nous simplement l'implémenter comme des appels d'API normaux?
  • Selon ma connaissance & il devrait être mis en œuvre de manière similaire comme API normales
  • S'il vous plaît ne me laisser aucune trace ou si quelque chose de mal, je suis en train de faire au format de demande

Merci à l'avance.

+0

Juste une question: Pourquoi n'utilisez-vous pas simplement le SDK d'Amazon: http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3-pre-signed-urls.html? –

+0

@AndreasOetjen effectivement, l'URL pré-signée est générée à partir du codage côté serveur et que le client fournit à travers une API et que je vais devoir utiliser ici pour le fichier de téléchargement. Donc, peut dire que la moitié du processus est sur le côté serveur. – Mayur

+0

Je ne suis pas un expert en protocole HTTP, mais je vois quelques problèmes avec votre approche: D'abord la limite: Où l'indiquez-vous dans l'en-tête HTTP? Que se passe-t-il si (par coïncidence) certaines de vos données contiennent uniquement la chaîne de caractères limite? Par conséquent, je voudrais juste recomment en utilisant le SDK (et je ne sais pas pourquoi vous ne devriez pas être en mesure d'utiliser le SDK, définitivement l'URL est générée sur le côté serveur, mais vous l'utilisez uniquement du côté client). –

Répondre

2

Enfin résolu le problème en modifiant le format des paramètres de demande. Voici le code de travail.

- (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]; 
} 

Espérons que cela aidera quelqu'un.