2013-05-29 9 views
5

Ich versuche, Daten an einen Server mit JSON zu senden. Ich kann mein NSDictionary mit meinen Objekten und Schlüsselparametern erstellen. Aber ich möchte mein Bild senden, und das Bild ist UIImage.So senden Sie UIImage im JSON-Format, indem Sie ein NSDictionary füllen

Also frage ich mich, wie kann ich mein Bild in meinem NSDictionary hinzufügen? Weil ich den Inhalt meines Bildes senden möchte. Wenn ich mein Objekt hinzufügen UIImage ... Ich werde das ganze Objekt richtig senden?

Dank

+0

Okay, interessant ... Wenn Sie „finden Sie in der Syntax“ sagen, das ist gemein, dass es eine Möglichkeit ist, dass mit Json zu schicken? Oder sollte ich die Lösung ändern? – manonthemoon

+0

Hot Licks ist falsch. Siehe Romans Antwort. –

+0

Sie sollten keine großen Bilder (oder andere große Datenobjekte) als Base64 in JSON senden. Der Overhead in Bezug auf Zeit und Raum ist groß und es gibt andere bessere Möglichkeiten, diese Daten zu senden. –

Antwort

6

Sie sollten die UIImage in NSString konvertieren. Verwenden Sie die Kategorie der NSData NSDataAdditions.You genannt finden Sie hier: NSDataAdditions category

Wie man verwendet:

//Convert an Image to String 
UIImage *anImage; 
NSString imageString = [UIImagePNGRepresentation(anImage) base64Encoding]; 

//To retrieve 
NSData *data = [NSData dataWithBase64EncodedString:imageString]; 
UIImage *recoverImage = [[UIImage imageWithData:data]; 
+1

Nur so Leute wissen, NSData hat seine eigene base64EncodedStringWithOptions: Methode seit iOS7, keine Notwendigkeit für eine Kategorie mehr. –

+0

Sie haben Recht, @SebastienPeek –

2

Sie versuchen UIImage mit NSString wie folgt senden: Swift 3:

if let jpegData = UIImageJPEGRepresentation(image, 1.0) { 
    var encodedString = jpegData.base64EncodedString() 
    var mainJSON = [ 
     "First_Name" : "John", 
     "Last_name" : "McCintosh", 
     "Profile_picture" : encodedString 
    ] 

} 

Objective-C:

NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 
NSString *encodedString = [imageData base64Encoding]; 


NSDictionary* mainJSON = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"John", 
          @"First_Name", 
          @"McCintosh", 
          @"Last_name", 
          encodedString, 
          @"Profile_picture", 
          nil]; 

Dies ist Base64-Format, so dass Sie diese entschlüsseln kann in jeder Sprache

+0

Okay, ich werde diese Lösung versuchen :) Ich gebe dir Feedback in einigen Minuten. Danke – manonthemoon

+0

Hey, für die UIImageJPEGrepresentation funktioniert es ohne Problem. Aber für base64encoding kann er die Methode nicht finden. Ich habe diese Warnung: 'no visible @interface für deklariert den Selektor base64 Encoding' – manonthemoon

+0

@manonthemoon Ich denke 'base64encoding' ist eine benutzerdefinierte Methode in einer Kategorie für NSData implementiert.Ich habe einen mit dem gleichen Namen [hier] gefunden (http://colloquy.info/project/browser/trunk/Additions/NSDataAdditions.m), vielleicht kannst du ihn benutzen. – tolgamorf

4

würde ich normalerweise nicht ein Post Bild mit JSON. Obwohl es technisch möglich ist, ein Bild in Text zu kodieren, glaube ich nicht, dass JSON so verwendet werden soll, und ich würde die Praxis persönlich vermeiden.

Umgang mit Bildern als NSData. Das sind sie. Es gibt Tonnen von Beispielen online, dass illustrate how to do this. Ein gängiger Ansatz besteht darin, ein Bild auf einen Webserver hochzuladen, dann die URL des hochgeladenen Bildes zu übernehmen und dieses in Ihr JSON-Wörterbuch einzufügen, so dass das von Ihnen übergebene JSON-Wörterbuch eine Zeichenfolge enthält, die die URL des Bildes darstellt herunterladen - nicht das Bild selbst.

+0

Ich würde das Bild und die JSON separat hochladen. +1 – lnafziger

+0

Danke für den Austausch von Wissen, jetzt verstehe ich, dass JSON nur Zeichenfolgen Nummern und booleans unterstützt. Aber wenn ich das Bild kodieren ist möglich ... Was denkst du über die Lösung von Roman? Es sieht gut aus, nein? Für den Moment habe ich nur ein Problem, um Arbeit zu machen base64encoding ... Oder vielleicht sollte ich JSON vergessen und versuchen Sie die Lösung in den Link "veranschaulichen, wie dies zu tun" – manonthemoon

+1

@manonthemoon Ich denke, dass Roman's Antwort kann technisch funktionieren, aber es verwendet JSON in einer Weise, dass es nicht wirklich verwendet werden soll, und es gibt ein paar Möglichkeiten, wie ich es falsch laufen sehen kann. Es ist nur ein bisschen mehr Arbeit, dies auf eine "bessere" Weise zu tun - zB das Bild zu kodieren, das Bild hochzuladen, die URL für das hochgeladene Bild zu nehmen, es zu deinem JSON-Wörterbuch hinzuzufügen und das JSON-Wörterbuch hochzuladen. Der Link, den ich eingefügt habe, zeigt genau, wie man das Bild selbst codiert und hochlädt. – isaac

0

Okay, Thansk @tolgamorf und @isaac, versuchte ich AFNetwork verwenden. Ich könnte tun, was ich will. Es ist mächtig und einfach.

NSURL *url = [NSURL URLWithString:@"http://api-base-url.com"]; 
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"avatar.jpg"], 0.5); 
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 
[formData appendPartWithFileData:imageData name:@"avatar" fileName:@"avatar.jpg" mimeType:@"image/jpeg"]; 
}]; 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 
NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite); 
}]; 
[httpClient enqueueHTTPRequestOperation:operation]; 

nahm ich den Code aus offizieller Dokumentation von here.

Genießen