如何通过填充 NSDictionary 以 JSON 格式发送 UIImage
Posted
技术标签:
【中文标题】如何通过填充 NSDictionary 以 JSON 格式发送 UIImage【英文标题】:How to send UIImage in JSON format, by filling a NSDictionary 【发布时间】:2013-05-29 15:56:54 【问题描述】:我正在尝试使用 JSON 将数据发送到服务器。 我可以使用我的对象和关键参数创建我的 NSDictionary。 但是我想发我的图片,图片是UIImage。
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];
);
所以我想知道如何在我的 NSDictionary 中添加我的图片? 因为我想发送我的图片内容。如果我添加我的对象 UIImage... 我会发送整个对象对吗?
谢谢
【问题讨论】:
好吧有趣...当您说“查看语法”时,这意味着有一种方法可以使用 Json 发送它?或者我应该改变解决方案? Hot Licks 是错误的。请参阅 Roman 的回答。 您不应将大图像(或其他大数据对象)作为 JSON 中的 Base64 发送。时间和空间上的开销很大,还有其他更好的方式来发送这些数据。 【参考方案1】:您应该将 UIImage 转换为 NSString。使用名为 NSDataAdditions 的 NSData 类别。您可以在此处找到: NSDataAdditions category
如何使用:
//Convert an Image to String
UIImage *anImage;
NSString imageString = [UIImagePNGRepresentation(anImage) base64Encoding];
//To retrieve
NSData *data = [NSData dataWithBase64EncodedString:imageString];
UIImage *recoverImage = [[UIImage imageWithData:data];
【讨论】:
大家都知道,NSData 有自己的 base64EncodedStringWithOptions: 从 ios7 开始的方法,不再需要类别了。【参考方案2】:我通常不会使用 JSON 发布图片。虽然技术上可以将图像编码为文本,但我认为 JSON 的用途并非如此,我个人会避免这种做法。
将图像作为 NSData 处理。他们就是这样。网上有很多例子illustrate how to do this。
一种常见的方法是将图像上传到网络服务器,然后获取上传图像的 URL 并将 that 添加到您的 JSON 字典中,以便您提交的 JSON 字典带有一个表示要下载的图片的 URL——不是图片本身。
【讨论】:
我也会分别上传图片和 JSON。 +1 感谢分享知识,现在我明白 JSON 只支持字符串数字和布尔值。但是,如果我对图像进行编码是可能的……您如何看待 Roman 的解决方案?看起来不错不是吗?目前我只是在进行 base64encoding 工作时遇到问题......或者我应该忘记 JSON 并尝试链接“说明如何执行此操作”中的解决方案 @manonthemoon 我认为 Roman 的答案在技术上可能有效,但它使用 JSON 的方式并非真正打算使用,而且我可以通过几种方式看到它出错了。以“更好”的方式执行此操作只需稍微多一点工作 - 例如,编码图像,上传图像,然后获取上传图像的 URL,将其添加到您的 JSON 字典,然后上传 JSON 字典。我包含的链接准确地显示了如何编码和上传图像本身。 @manonthemoon 这是正确的做法,您不应将数据嵌入 JSON 中。 @manonthemoon 仅供参考,对于下载和上传数据,我个人使用AFNetworking,这是一个强大的 iOS/MacOSX 网络库。您也应该检查一下。【参考方案3】:您可以尝试使用 NSString 发送 UIImage,如下所示: 斯威夫特 3:
if let jpegData = UIImageJPEGRepresentation(image, 1.0)
var encodedString = jpegData.base64EncodedString()
var mainJSON = [
"First_Name" : "John",
"Last_name" : "McCintosh",
"Profile_picture" : encodedString
]
目标-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];
这是 Base64 格式,因此您可以用任何语言对其进行解码
【讨论】:
好的,我要试试这个解决方案 :) 我会在几分钟后给你反馈。谢谢 嘿,对于 UIImageJPEGRepresentation,它可以正常工作。但是对于base64encoding,他找不到方法。我有这个警告:'没有可见的@interface 声明选择器 base64 编码' @manonthemoon 我认为base64encoding
是在 NSData 类别中实现的自定义方法。我找到了一个同名的here,也许你可以使用它。
[NSData base64Encoding] 自 iOS 7 起已弃用,请使用 [NSData base64EncodedStringWithOptions:]【参考方案4】:
好的,感谢@tolgamorf 和@isaac,我尝试使用AFNetwork。 我可以做我想做的事。它功能强大且简单。
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];
我从here 获取官方文档中的代码。
享受
【讨论】:
以上是关于如何通过填充 NSDictionary 以 JSON 格式发送 UIImage的主要内容,如果未能解决你的问题,请参考以下文章
通过过滤另一个 NSDictionary 来获取一个 NSDictionary
如何从使用 JSONKit 创建的 NSDictionary 中正确填充 UITableView NSArray?