Problème de taille, transfert iphone vers serveur

mcjoe

Membre confirmé
22 Décembre 2011
20
2
Grenoble
Bonjour à tous

Je rencontre actuellement un problème lorsque je cherche à envoyer mes images depuis l'iphone vers internet, elles n'arrivent pas complète à destination.

Je m'explique, j'envoie des données (via un NSMutableData), une première image, puis une seconde image. Les relevés donnent ça :
Before img_one : 999
Img_one : 142946
before img_two : 143945
Img_two : 191841
Total : 335848

Les tailles sont alors bonnes.
J'envoie sur le serveur, (qui contient un code tout simple d'upload, et pour plus de sécu, j'ai fait affiché les tailles d'images) et je me retrouve avec une image de 70ko et l'autre de 167ko. Il m'est donc impossible de les exploiter.
Chose importante à préciser, je n'ai aucun message d'erreur

Voici les codes correspondant au problème :

Bloc de code:
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@save_spot.php?from_iphone=true", self.baseUrl]];
    NSMutableURLRequest *query = [[NSMutableURLRequest alloc] initWithURL:url];
        //On envoie par POST
        //Ne pas oublier, encodage UTF8 parce qu'on doit gérer les accents
    
    [query setHTTPMethod:@"POST"];
    
        //Création du header (long, long, long)
    [query addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField: @"Content-Type"];
        
    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[self makeDataProperty:@"password" value:password]dataUsingEncoding:NSUTF8StringEncoding]];
//Normalement, il y a plus d'info mais passons
//makeDataProperty fonctionne très bien, pas la peine de la montrer
    NSLog(@"Before img_one : %u", [body length]);
    if (![spot.img_one isEqualToString:@""]) {
        [body appendData:[self addHeaderForImage:spot.img_one andNumberIs:1]];
        NSLog(@"Img_one : %u", [self addHeaderForImage:spot.img_one andNumberIs:1].length);
    }
    NSLog(@"before img_two : %u", [body length]);
    if (![spot.img_two isEqualToString:@""]) {
        [body appendData:[self addHeaderForImage:spot.img_two andNumberIs:2]];
        NSLog(@"Img_two : %u", [self addHeaderForImage:spot.img_two andNumberIs:2].length);
    }
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [query addValue:[NSString stringWithFormat:@"%u",body.length] forHTTPHeaderField:@"Content-Length"];
    
    [query setHTTPBody:body];
    
    NSLog(@"Total : %u", query.HTTPBody.length);
    
    NSURLResponse* response = nil;
    NSError* error = nil;
    
    NSData *result = [NSURLConnection sendSynchronousRequest:query returningResponse:&response error:&error];
//Bien évidemment, il reste du code de traitement des erreurs derrière

Maintenant, la fonction qui permet l'envoi d'image

Bloc de code:
- (NSMutableData*)addHeaderForImage:(NSString *)image andNumberIs:(int)number {
    
    if ([[NSFileManager defaultManager] fileExistsAtPath:image]) {
        if ([image.pathExtension isEqual:@"png"] || [image.pathExtension isEqual:@"jpg"]
            ||
            [image.pathExtension isEqual:@"PNG"] || [image.pathExtension isEqual:@"JPG"]) {
            
            NSString* img_name = [NSString stringWithFormat:@"%i.%@", number, image.pathExtension];
            NSData* dataImg = nil;
            NSMutableData* header = [[NSMutableData alloc]init];
            
            if ([image.pathExtension isEqual:@"png"] || [image.pathExtension isEqual:@"PNG"])
                dataImg = UIImagePNGRepresentation([UIImage imageWithContentsOfFile:image]);
            else if ([image.pathExtension isEqual:@"jpg"] || [image.pathExtension isEqual:@"JPG"])
                dataImg = UIImageJPEGRepresentation([UIImage imageWithContentsOfFile:image], 1.0);
            
            [header appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", self.boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            [header appendData:[[NSString stringWithFormat:@"Content-Disposition: attachment; name=\"%i\"; filename=\"%@\"\r\n", number, img_name] dataUsingEncoding:NSUTF8StringEncoding]];
            [header appendData:[NSData dataWithData:dataImg]];
            
            return header;
        }
    }
    
    return nil;
}

Voilà je pense que tout est mis, je n'ai rien oublié.
Le code coté serveur est un upload classique mais de toute façon je pense que le problème vient de la connection, cependant, je ne vois pas comment, je suis en local pour mes tests.

Merci d'avance de vos idées :)
 
Bon en fait, après avoir encore passé 3 heures dessus, j'ai trouvé.

Pour information, il me manquait des informations dans le leader lorsque je transfère l'image. Voilà le code, qui serait alors à rajouter dans -(NSMutableData)addHeaderForImage:(NSString*)image

Bloc de code:
[header appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
            [header appendData:[NSData dataWithData:dataImg]];
            [header appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", self.boundary] dataUsingEncoding:NSUTF8StringEncoding]];

Tout ça pour 3 lignes dans le header ^^