Caricamento dell’immagine tramite POST nell’objective C

Attualmente sto lavorando per caricare un’immagine su un server tramite HTTP Post e non riesco a trovare un modo per creare l’url che chiama il servizio. L’utente seleziona un’immagine dalla libreria o dalla fotocamera e quindi chiama un servizio JSON che esegue l’istruzione insert.

Il servizio è in attesa del seguente uritemplate:

@"%@/DataTransfer/SetUserProfileImage?EMP_ID=%@&image=%@&imageName=%@" 

Si aspetta che i dati dell’immagine vengano convertiti in qualche modo in stringhe e inviati tramite url.

Questo è il mio codice attuale:

 - (BOOL)setUserProfileImage:(UIImage *)imgUser Name:(NSString *)strName{ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSData *dataImage = UIImagePNGRepresentation(imgUser); NSString* theNSString = [[NSString alloc] initWithData:dataImage encoding:NSASCIIStringEncoding]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/DataTransfer /SetUserProfileImage?EMP_ID=%@&" "image=%@&imageName=%@", appDelegate.ServerAddress, appDelegate.UserId, theNSString, strName]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSURLResponse* response = nil; NSError* resultError = nil; NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&resultError]; NSString *strResult = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; BOOL imgResponse = [strResult boolValue]; [strResult release]; return imgResponse; } 

Ottengo un errore dicendo che NSURL è “”. Non riesco a creare un URL corretto. So che il servizio stesso converte nuovamente questa stringa in un’immagine.

AGGIORNARE:

 - (BOOL)setUserProfileImage:(UIImage *)imgUser Name:(NSString *)strName{ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSString *url = [NSString stringWithFormat:@"%@/DataTransfer/SetUserProfileImage",appDelegate.ServerAddress]; NSData *data = UIImagePNGRepresentation(imgUser); NSString * boundary = @"tweetPhotoBoundaryParm"; NSMutableData *postData = [NSMutableData dataWithCapacity:[data length] + 1024]; name=\"EMP_ID\"\r\n\r\n%@", @"100-01"]; NSString * boundaryString = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary]; NSString * boundaryStringFinal = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary]; [postData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]]; [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\";\r\nfilename=\"media.png\"\r\nContent-Type: image/png\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postData appendData:data]; [postData appendData:[boundaryStringFinal dataUsingEncoding:NSUTF8StringEncoding]]; NSMutableURLRequest * theRequest=(NSMutableURLRequest*)[NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [theRequest setHTTPMethod:@"POST"]; [theRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"]; //[theRequest addValue:@"www.tweetphoto.com" forHTTPHeaderField:@"Host"]; NSString * dataLength = [NSString stringWithFormat:@"%d", [postData length]]; [theRequest addValue:dataLength forHTTPHeaderField:@"Content-Length"]; [theRequest setHTTPBody:(NSData*)postData]; NSURLConnection * theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; if (theConnection) { webData =[[NSMutableData data] retain]; } else { NSLog(@"%@",@"Could not connect to the network"); } return false; } 

Objective-C

 -(void)saveImageToServer { // COnvert Image to NSData NSData *dataImage = UIImageJPEGRepresentation([UIImage imageNamed:@"yourImage"], 1.0f); // set your URL Where to Upload Image NSString *urlString = @"Your URL HERE"; // set your Image Name NSString *filename = @"YourImageFileName"; // Create 'POST' MutableRequest with Data and Other Image Attachment. NSMutableURLRequest* request= [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *postbody = [NSMutableData data]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[NSData dataWithData:dataImage]]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postbody]; // Get Response of Your Request NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"Response %@",responseString); } 

veloce

 // COnvert Image to NSData var dataImage: NSData = UIImageJPEGRepresentation(UIImage(named: "yourImage"), 1.0) // set your URL Where to Upload Image var urlString: String = "Your URL HERE" // set your Image Name var filename: String = "YourImageFileName" // Create 'POST' MutableRequest with Data and Other Image Attachment. var request: NSMutableURLRequest = NSMutableURLRequest() request.URL = NSURL(string: urlString)! request.HTTPMethod = "POST" var boundary: String = "---------------------------14737809831466499882746641449" var contentType: String = "multipart/form-data; boundary=\(boundary)" request.addValue(contentType, forHTTPHeaderField: "Content-Type") var postbody: NSMutableData = NSMutableData.data() postbody.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)) postbody.appendData("Content-Disposition: form-data; name=\"userfile\"; filename=\"\(filename).jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)) postbody.appendData(String.stringWithString("Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)) postbody.appendData(NSData.dataWithData(dataImage)) postbody.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)) request.HTTPBody = postbody // Get Response of Your Request var returnData: NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil) var responseString: String = String(data: returnData, encoding: NSUTF8StringEncoding) NSLog("Response %@", responseString) 

Questo approccio ha diversi problemi.

1) La conversione dei byte non elaborati di un’immagine in una stringa non funzionerà mai.

 NSData *dataImage = UIImagePNGRepresentation(imgUser); NSString* theNSString = [[NSString alloc] initWithData:dataImage encoding:NSASCIIStringEncoding]; 

Avrà esito negativo. Non sarai mai in grado di ribuild dataImage da theNSString . È necessario basare 64 codifica dataImage. Usa qualcosa come questo per fare la codifica base 64.

2) Non inserire i dati dell’immagine in un URL. Devi inserire i dati dell’immagine in un corpo postale.

3) Non utilizzare “application / x-www-form-urlencoded”, utilizzare “multipart / form-data”.


Aggiornato dopo i commenti

Ci dispiace, ma sembra che tu abbia molto lavoro da fare per capire il tuo sistema.

Nell’esempio sopra, hai aggiunto tutti i dati alla stringa di query dell’URL, ma non hai aggiunto nulla al corpo del messaggio. Nell’esempio si imposta il tipo di contenuto come “application / x-www-form-urlencoded”.

Ora sembri pensare che il POST debba essere in JSON. Hai bisogno di scoprire come dovrebbe essere fatto. Come deve essere allegato questo messaggio JSON? Prima hai detto che i dati dovevano essere nell’URL, è ancora così? Se è necessario albind il messaggio JSON al corpo POST, che cosa deve essere il tipo di contenuto del POST? Qual è la struttura del messaggio JSON (tutti i campi chiave / valore necessari)?

Prima che qualcuno possa aiutarti, devi scoprire esattamente cosa è necessario. Ci dovrebbe essere qualcuno che può darti una descrizione accurata del messaggio HTTP.