2012-12-29 52 views
1

我知道这个问题已被质疑多次,但我的问题有点不同。我有一个图像(shared.image),我想将数据上传到服务器。这是代码(IMG:位只是一种方式来让服务器知道这是一个图像,而不是一个字符串):UIImage> NSData> NSString失败

NSString *imageString = [NSString stringWithFormat:@"img:%@", UIImagePNGRepresentation(shared.image)]; 
NSData *imageData = [imageString dataUsingEncoding:NSUTF8StringEncoding]; 
[shared.outputStream write:[imageData bytes] maxLength:[imageData length]]; 

当服务器响应回(字符串),这是其他代码(shared.array是一个数组这些基团的所有字符串的分组分片的情况下的IMG:比特将被删除):

string = [shared.imageArray componentsJoinedByString:@""]; 
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 
imageView.image = [UIImage imageWithData:data]; 

我nslogged [UIImage的imageWithData:数据]和它返回零。 我在做什么错?

感谢

+0

你能读取服务器响应,NSData的,它从NSData的转换的UIImage?你确定服务器回应一个图像吗? – nhahtdh

+0

不幸的是没有,因为我不知道Python中是否有NSData等价物(服务器是用Python编写的) – GreatGoldApps

+0

不,这不是我所问的。你为什么要将服务器的响应存储为字符串 - 这就是我所要求的。 – nhahtdh

回答

4

你为什么要往返于NSString当你有二进制数据?如果要加载imageData与图像的内容,你会绕过NSString干脆:

NSData *imageData = UIImagePNGRepresentation(shared.image); 

如果你的服务器接受的二进制数据,这就是你所需要的。

如果它需要文本字符串,那么您提出的代码将不会完成这项工作,而是您应该使用类似于Base64的东西来编码它(例如使用Matt Gallager's NSData+Base64 category)。例如:

NSData *imageData = UIImagePNGRepresentation(shared.image); 
NSString *imageString = [NSString stringWithFormat:@"img:\"%@\"", [imageData base64EncodedString]]; 

请注意在响应中,我建议将Base64编码的字符串括在引号中。这样,收件人可以检测到Base64编码字符串的结尾。仅供参考,我试着尊重你的img:接口,但你也可以考虑使用标准data URI scheme,或许是这样的:

NSString *imageString = [NSString stringWithFormat:@"img:\"data:image/png;base64,%@\"", [imageData base64EncodedString]]; 

这是给你的。

在解析服务器响应方面,它又是一个问题,它是一个字符串(在这种情况下,它应该是数据的Base64表示形式),还是二进制数据(在这种情况下,您应该只是将数据附加到您的NSMutableData,然后只使用imageWithData)。

+0

我想这样做,但由于img:前缀,我需要将数据放入字符串中(服务器使用它来知道哪些数据它收到)。但我会尝试base64库 – GreatGoldApps

+1

@GreatGoldApps这是一个奇怪的界面,其中你有一个二进制数据流的文本前缀。或者,如果服务器期望Base64,我会认为这应该是界面的明确部分。你不应该只是“尝试”Base64,但你应该确定Web服务期望的是什么,并为此编写代码。你是从自己的网络服务上传和下载的吗?还是你与一些既定的网络服务接口?你能和我们分享这些细节吗? – Rob

+0

服务器是我的。代码是从这个raywenderlich教程:http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server – GreatGoldApps

4

的IOS> = 7

- (NSString *)imageToNSString:(UIImage *)image 
{ 
    NSData *imageData = UIImagePNGRepresentation(image); 

    return [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 
} 

- (UIImage *)stringToUIImage:(NSString *)string 
{ 
    NSData *data = [[NSData alloc]initWithBase64EncodedString:string 
                 options:NSDataBase64DecodingIgnoreUnknownCharacters]; 

    return [UIImage imageWithData:data]; 
}