2010-05-25 112 views
4

我今天在这工作了几个小时,而且我非常接近解决方案,但显然需要一些将此关闭的人的帮助。我正在尝试将图像发布到iPhone的Web服务。我先发布代码,然后解释一切我已经试过:iPhone UIImage上传到网络服务

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”参数更改为字符串并传入字符串,一切正常,我会得到一个返回值没有问题。因此,根本没有连接问题,我可以在此服务器上调用并从此Web服务获取数据,而不会出现任何问题。但是我需要通过ImgIn参数将图像上传到这个Web服务,所以上面的代码是我迄今为止最好的。我也有处理didReceiveResponse,didReceiveData,didFailWithError等。上面的代码每次都会触发didRecieveResponse。但是didReceiveData永远不会被解雇,它就像Web服务本身从未运行过。当我调试Web服务本身时,它在我使用字符串参数时运行和调试正常,但是使用图像参数时,它甚至在我调用它时都不会调试。这几乎就像ImgIn参数太长了(当我将它输出到屏幕时它是巨大的)并且Web服务只是扼杀它。我已经阅读了使用这种方法时必须编码到Base64的内容,但我无法找到有关如何完成的任何良好链接。如果这就是我做错了,你能否提供代码,如何做到这一点,而不仅仅是“你需要使用Base64”,我真的很感激它,因为我几乎找不到任何关于如何实现这一点例。除此之外,我有点失落,看起来我正在做其他事情。请帮忙!

感谢

回答

6

因为%@格式说明需要一个对象,并调用它失败 - (的NSString *)的说明把它变成一个字符串。 - [NSData description]为(ASCII)“123abc”返回类似@“< 31 32 33 65 66 67>”的内容,因此您要提交< 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% larger

+0

这很好。我不得不放弃Web服务并发布到网页上。我很感激帮助。 – AS2012 2010-05-25 15:14:28

+0

@tc。 :您可以发布您已经回答的此上传方法的代码。 – Nit 2012-05-10 09:15:11