2013-05-29 39 views
5

doldurarak JSON biçiminde UIImage gönderme JSON ile bir sunucuya veri göndermeye çalışıyorum. NSDictionary öğemi nesnelerim ve anahtar parametrelerimle oluşturabiliyorum. Ama resmimi göndermek istiyorum ve resim UIImage. Bir NSDictionary

NSDictionary* mainJSON = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"John", 
          @"First_Name", 
          @"McCintosh", 
          @"Last_name", 
          <HERE I WANT PICTURE>, 
          @"Profile_picture", 
          nil]; 

// Here I convert to NSDATA 
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:mainJSON options:NSJSONWritingPrettyPrinted error:&error]; 

// Sending operation : 
dispatch_async(kBgQueue,^
        { 
         NSData * data = [NSData dataWithContentsOfURL:@"addresSERVER"]; 
         [self performSelectorOnMainThread:@selector(receivedResponseFromServer:) 
               withObject:data 
              waitUntilDone:YES]; 
        } 
        ); 

Yani nasıl benim NSDictionary resmimi ekleyebilir merak ediyorum? Çünkü resmimin içeriğini göndermek istiyorum. UIImage nesnesini eklerseniz ... Bütün nesneyi gönderirim doğru mu?

Teşekkür

+0

ilginç Tamam ... siz "sözdizimi bkz" derken Enjoy? Ya da çözümü değiştirmeliyim? – manonthemoon

+0

Sıcak Yalama yanlış. Roma'nın cevabını görün. –

+0

JSON'da Base64 olarak büyük görüntüler (veya diğer büyük veri nesneleri) göndermemelisiniz. Zaman ve mekan açısından yükü büyüktür ve bu verileri göndermenin daha iyi yolları vardır. –

cevap

6

UIImage öğesini NSString'e dönüştürmelisiniz. NSData kategorisi NSDataAdditions.You burada bulabilirsiniz denilen kullanın: NSDataAdditions category

Nasıl Kullanılır: Tamam

//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

NSData, artık bir kategoriye ihtiyaç duymadığından NSData'nın kendi base64EncodedStringWithOptions: yöntemine sahip olduğunu bilmesi için. –

+0

Haklısınız, @SebastienPeek –

2

Böyle NSString ile UIImage göndermek deneyebilirsiniz: Swift 3:

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

} 

Amaç-c: Bu bunudeşifre böylece Base64 formatında

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


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

olduğunu Herhangi bir dilde

+0

Tamam, bu çözümü deneyeceğim :) Size birkaç dakika içinde geri bildirim vereceğim. Teşekkürler – manonthemoon

+0

Hey, UIImageJPEGRepresentation için, sorunsuz çalışıyor. Ancak base64encoding için yöntemi bulamıyor. Bu uyarıya sahibim: 'selektör tabanını belirten görünmez @interface64 Kodlama' – manonthemoon

+0

@manonthemoon 'base64encoding', NSData için bir kategoride uygulanan özel bir yöntemdir.Aynı ada sahip bir tane buldum (http://colloquy.info/project/browser/trunk/Additions/NSDataAdditions.m), belki bunu kullanabilirsiniz. – tolgamorf

4

Genelde bir JSON kullanarak görüntü. Bir görüntüyü metne kodlamak teknik olarak mümkün olsa da, JSON'un nasıl kullanılmasının amaçlandığını düşünmüyorum ve uygulamayı kişisel olarak önleyeceğim.

Görüntülerin NSData olarak ele alınması. İşte böyle. Çevrimiçi olarak illustrate how to do this numaralı tonlarca örnek var.

bir ortak yaklaşım daha sonra, bir web sunucusuna bir resim yüklemek yüklenen resmin URL'sini almak ve JSON sözlüğüne olduğunu, öyle ki Gönderilen JSON sözlük resmin URL'sini temsil eden bir dize taşıyan eklemektir indirmek için - görüntü kendisi değil.

+0

kullanın. Resmi ve JSON'ı ayrıca yüklerim. +1 – lnafziger

+0

Bilgi paylaşımı için teşekkürler, şimdi JSON sadece dizeleri ve booleanlar desteklediğini anlıyorum. Ama görüntüyü şifrelersem mümkün ... Roma'nın çözümü hakkında ne düşünüyorsunuz? İyi görünüyor mu? Şimdilik sadece iş tabanı6464 kodlaması yapmakta sorunum var ... Ya da JSON'u unutmam ve bağlantıdaki çözümü denemeliyim "bunu nasıl yapacağını göster" – manonthemoon

+1

@manonthemoon Sanırım Roma'nın cevabı teknik olarak işe yarayabilir ama JSON'u gerçekten kullanılması amaçlanmayan şekillerde kullanıyor ve yanlış gittiğini görebileceğim birkaç yol var. Bunu "daha iyi" bir şekilde yapmak için biraz daha fazla çalışma - örneğin, görüntüyü kodlayın, resmi yükleyin, sonra yüklenen resmin URL'sini alın, onu JSON sözlüğünüze ekleyin ve JSON sözlüğünü yükleyin. Dahil ettiğim bağlantı, resmin kendisini nasıl kodlayacağını ve yükleyeceğini tam olarak gösterir. – isaac

0

, thansk @tolgamorf ve @isaac, ben AFNetwork kullanarak çalıştı. İstediğimi yapabilirim. Bu güçlü ve basit.

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

ben here resmi belgelere kodu aldı.

o Json ile bu göndermek için bir yol olduğunu demek,