2013-05-29 28 views
5

Tôi đang cố gắng gửi dữ liệu đến máy chủ bằng JSON. Tôi có thể tạo NSDictionary với các đối tượng và thông số chính của mình. Nhưng tôi muốn gửi hình ảnh của tôi, và hình ảnh là UIImage.Cách gửi UIImage ở định dạng JSON, bằng cách điền vào một 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]; 
        } 
        ); 

Vì vậy, tôi tự hỏi làm cách nào để thêm ảnh của mình vào NSDictionary? Vì tôi muốn gửi nội dung hình ảnh của mình. Nếu tôi thêm đối tượng của tôi UIImage ... Tôi sẽ gửi toàn bộ đối tượng phải không?

Cảm ơn

+0

Okay thú vị ... Khi bạn nói "nhìn thấy cú pháp", điều đó có nghĩa là có một cách để gửi rằng với Json? Hoặc tôi nên thay đổi giải pháp? – manonthemoon

+0

Licks nóng là sai. Xem câu trả lời của Roman. –

+0

Bạn không nên gửi hình ảnh lớn (hoặc các đối tượng dữ liệu lớn khác) làm Base64 trong JSON. Chi phí về thời gian và không gian lớn, và có những cách tốt hơn để gửi dữ liệu này. –

Trả lời

6

Bạn nên chuyển đổi UIImage thành NSString. Sử dụng các chủng loại NSData gọi NSDataAdditions.You có thể tìm thấy ở đây: NSDataAdditions category

Làm thế nào để sử dụng:

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

Để mọi người biết, NSData có phương thức base64EncodedStringWithOptions: của riêng nó kể từ iOS7, không cần một danh mục nữa. –

+0

Bạn nói đúng, @SebastienPeek –

2

Bạn có thể thử gửi UIImage với NSString như thế này: 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]; 

Đây là định dạng Base64 để bạn có thể giải mã này bằng bất kỳ ngôn ngữ nào

+0

Được rồi, tôi sẽ thử giải pháp này :) Tôi sẽ cung cấp cho bạn phản hồi sau vài phút. Cảm ơn – manonthemoon

+0

Xin chào, vì bản trình bày UIImageJPEG, nó hoạt động không có vấn đề gì. Nhưng đối với base64encoding, anh ta không thể tìm ra phương thức. Tôi có cảnh báo này: 'không hiển thị @interface cho tuyên bố chọn base64 Mã hóa' – manonthemoon

+0

@manonthemoon Tôi nghĩ 'base64encoding' là một phương thức tùy chỉnh được triển khai trong một danh mục cho NSData.Tôi tìm thấy một cái có cùng tên [ở đây] (http://colloquy.info/project/browser/trunk/Additions/NSDataAdditions.m), có thể bạn có thể sử dụng nó. – tolgamorf

4

Tôi thường không đăng một hình ảnh sử dụng JSON. Mặc dù về mặt kỹ thuật có thể mã hóa một hình ảnh thành văn bản, tôi không nghĩ đó là cách JSON được dự định sử dụng và cá nhân tôi sẽ tránh thực hành.

Xử lý hình ảnh dưới dạng NSData. Đó là những gì họ đang có. Có rất nhiều ví dụ trực tuyến là illustrate how to do this.

Một cách tiếp cận phổ biến là tải hình ảnh lên máy chủ web, sau đó lấy URL của hình ảnh đã tải lên và thêm vào từ điển JSON của bạn, sao cho từ điển JSON đã gửi của bạn mang một chuỗi đại diện cho URL của hình ảnh để tải xuống - không phải hình ảnh.

+0

Tôi cũng sẽ tải lên hình ảnh và JSON một cách riêng biệt. +1 – lnafziger

+0

Cảm ơn bạn đã chia sẻ kiến ​​thức, bây giờ tôi hiểu rằng JSON chỉ hỗ trợ số chuỗi và boolean. Nhưng nếu tôi mã hóa hình ảnh là có thể ... Bạn nghĩ gì về giải pháp của La Mã? Có vẻ tốt không? Hiện tại, tôi chỉ gặp vấn đề khi tạo cơ sở64 mã hóa ... Hoặc có lẽ tôi nên quên JSON và thử giải pháp trong liên kết "minh họa cách thực hiện" – manonthemoon

+1

@manonthemoon Tôi nghĩ câu trả lời của Roman có thể hoạt động về mặt kỹ thuật, nhưng đang sử dụng JSON theo cách mà nó không thực sự có ý định được sử dụng và có một vài cách tôi có thể thấy nó sai. Chỉ có một chút công việc để làm điều này theo cách "tốt hơn" - ví dụ, mã hóa hình ảnh, tải lên hình ảnh, sau đó lấy URL cho hình ảnh đã tải lên, thêm nó vào từ điển JSON của bạn và tải lên từ điển JSON. Liên kết tôi đưa vào hiển thị chính xác cách mã hóa và tải lên chính hình ảnh đó. – isaac

0

Okay, Thansk để @tolgamorf và @isaac, tôi đã cố gắng sử dụng AFNetwork. Tôi có thể làm những gì tôi muốn. Nó mạnh mẽ và đơn giản.

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

Tôi lấy mã từ tài liệu chính thức từ here.

Thưởng thức

Các vấn đề liên quan