iPhone UIImage 上传到 Web 服务

4

我今天花了几个小时的时间研究,离解决问题很近,但显然需要一些已经成功完成此操作的人的帮助。我正试图从iPhone上传一张图片到Web服务。首先我会贴出代码,然后解释我尝试过的所有内容:

NSData *imageData = UIImageJPEGRepresentation(barCodePic, .9);


NSString *soapMsg = 
[NSString stringWithFormat:
 @"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><WriteImage xmlns=\"http://myserver/imagewebservice/\"><ImgIn>%@</ImgIn></WriteImage></soap:Body></soap:Envelope>",  [NSData dataWithData:imageData]
 ];


NSURL *url = [NSURL URLWithString:@"http://myserver/imagewebservice/service1.asmx"];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];

NSString *msgLength = 
[NSString stringWithFormat:@"%d", [soapMsg length]];
[req addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[req addValue:@"http://myserver/imagewebservice/WriteImage" forHTTPHeaderField:@"SOAPAction"];
[req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[req setHTTPMethod:@"POST"];
[req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];

conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
if (conn) {
    webData = [[NSMutableData data] retain];
}    

首先,这段代码对于除了图片之外的任何内容都可以正常工作。Web服务正在我的本地网络上运行,我可以随意更改源代码,如果我将"ImgIn"参数更改为字符串并传递一个字符串,一切都可以正常工作,我可以轻松获得返回值。因此,根本没有连接问题,我能够在该服务器上调用并获取数据,没有任何问题。但是,我需要通过ImgIn参数上传图像到这个Web服务,所以上面的代码是我迄今为止最好的尝试。我还处理了didReceiveResponse、didReceiveData、didFailWithError等所有内容。上面的代码每次都会触发didRecieveResponse。然而,didReceiveData从未触发过,就像Web服务本身从未运行过一样。当我调试Web服务本身时,使用字符串参数时它可以正常运行和调试,但是使用图像参数时,即使我调用它,它也从未调试过。就像ImgIn参数太长(当我将其输出到屏幕时很大)并且Web服务无法处理它一样。我已经阅读了关于在使用此方法时必须进行Base64编码的内容,但是我找不到任何关于如何完成这项工作的好链接。如果这就是我的错误所在,请提供如何执行此操作的代码,而不仅仅是“您需要使用Base64”,我真的很感激,因为我几乎找不到任何有关如何使用示例实现此操作的内容。除此之外,我有点迷失了方向,似乎我在做其他一切都是正确的。请帮忙!

谢谢

1个回答

6
它失败是因为%@格式说明符需要一个对象,并调用-(NSString*)description将其转换为字符串。-[NSData description]返回类似于“<31 32 33 65 66 67>”的内容,对于(ASCII)“123abc”,因此您提交了<31 32 33 65 66 67>,显然这不是有效的XML。不要将字符串粘合在一起(它会容易受到XML注入等攻击)。
我建议放弃SOAP,只使用
[req addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
[req setHTTPBody:imgData]

如果您想使用SOAP,则可能有一个Objective-C SOAP库可以为您打包。如果没有,您可以手动指定xs:base64Binary(我认为)并使用Base64编码的数据。这两种方法都不理想,因为它会使数据增大33%。如果你不幸的话,SOAP库会把它变成 20000% 以上


这个方法很好用。我只需要放弃使用网络服务,改为向网页提交请求即可。非常感谢您的帮助。 - Jeffrey Bane
@tc.:你能否发布一下你回答中提到的上传方法的代码? - Nitin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接