iPhone UIImage загрузить на веб-сервис - PullRequest
4 голосов
/ 25 мая 2010

Я работал над этим несколько часов сегодня, и я довольно близок к решению, но, очевидно, мне нужна помощь кого-то, кто справился с этим. Я пытаюсь опубликовать изображение на веб-сервис с 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];
}    

Во-первых, этот код отлично работает для всего, кроме изображения. Веб-сервис работает в моей локальной сети, и я могу изменить исходный код по желанию, и если я изменю параметр «ImgIn» на строку и передам строку, все работает нормально, возвращаемое значение без проблем. Так что проблем с подключением нет вообще, я могу звонить и получать данные из этого веб-сервиса на этом сервере без проблем. Но мне нужно загрузить изображение в этот веб-сервис через параметр ImgIn, поэтому приведенный выше код - мой лучший снимок. Я также обработал все функции: ReRereResponse, DidReceiveData, didFailWithError и т. Д. Приведенный выше код запускает didRecieveResponse каждый раз. Однако didReceiveData никогда не запускается, и это похоже на то, что сам веб-сервис никогда даже не запускается. Когда я отлаживаю сам веб-сервис, он работает и отлаживается нормально, когда я использую строковый параметр, но с параметром изображения он даже не отлаживается, когда я его вызываю. Похоже, что параметр ImgIn слишком длинный (он огромен, когда я вывожу его на экран), и веб-служба просто его подавляет. Я читал о необходимости кодировать в Base64 при использовании этого метода, но я не могу найти хорошие ссылки о том, как это делается. Если это то, что я делаю неправильно, ПОЖАЛУЙСТА, можете ли вы предоставить код о том, как это сделать, а не просто «вам нужно использовать Base64», я был бы очень признателен, поскольку почти ничего не могу найти, как реализовать это с помощью пример. Кроме этого, я вроде как потерян, похоже, что я все делаю правильно. Пожалуйста, помогите!

Спасибо

1 Ответ

6 голосов
/ 25 мая 2010

Сбой, потому что спецификатор формата% @ принимает объект и вызывает - (NSString *) описание, чтобы превратить его в строку. - [Описание NSData] возвращает что-то вроде @ "<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% больше !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...