gpt4 book ai didi

iPhone UI图像上传到网络服务

转载 作者:行者123 更新时间:2023-12-03 19:11:04 25 4
gpt4 key购买 nike

我今天花了几个小时来解决这个问题,我已经非常接近解决方案,但显然需要解决这个问题的人的一些帮助。我正在尝试从 iPhone 将图像发布到网络服务。我将首先发布代码,然后解释我尝试过的所有内容:

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”,我真的很感激,因为我几乎找不到任何有关如何使用例子。除此之外,我有点迷失了,似乎我其他一切都做对了。请帮忙!

谢谢

最佳答案

它失败是因为 %@ 格式说明符接受一个对象并调用 -(NSString*)description 将其转换为字符串。 -[NSData description] 返回类似 @"<31 32 33 65 66 67>"for (ASCII) "123abc"的内容,因此您提交的 <31 32 33 65 66 67> 显然不是有效的 XML。不要将字符串粘合在一起(它很容易受到 XML 注入(inject)等攻击)。

我会放弃 SOAP,只使用

[req addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
[req setHTTPBody:imgData]

如果您想使用 SOAP,那么可能有一个 Objective-C SOAP 库可以为您进行打包。如果失败,您可以手动指定 xs:base64Binary (我认为)并使用 base64 编码的数据。这两种方法都不理想,因为它会使数据增大 33%。如果你运气不好,SOAP 库可以做到 20000% larger !

关于iPhone UI图像上传到网络服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2901797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com