iPhone UIImage загрузить на веб-сервис
Я работал над этим в течение нескольких часов сегодня, и я довольно близок к решению, но явно нуждаюсь в некоторой помощи от кого-то, кто выполнил это. Я пытаюсь опубликовать изображение на веб-сервис с 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, поэтому приведенный выше код - мой лучший снимок. У меня также есть обработанные обработчики didReceiveResponse, didReceiveData, didFailWithError и т. Д. Приведенный выше код запускает didRecieveResponse каждый раз. Однако didReceiveData никогда не запускается, и похоже, что сам веб-сервис никогда даже не запускается. Когда я отлаживаю сам веб-сервис, он работает и отлаживается нормально, когда я использую строковый параметр, но с параметром изображения он даже не отлаживается, когда я его вызываю. Похоже, что параметр ImgIn слишком длинный (он огромен, когда я вывожу его на экран), и веб-служба просто его подавляет. Я читал о необходимости кодировать в Base64 при использовании этого метода, но я не могу найти хорошие ссылки о том, как это делается. Если это то, что я делаю неправильно, можете ли вы ПОЖАЛУЙСТА предоставить код о том, как это сделать, а не просто "вам нужно использовать Base64", я был бы очень признателен, поскольку почти ничего не могу найти, как реализовать это с помощью пример. Кроме этого, я вроде как потерян, похоже, что я все делаю правильно. Пожалуйста помоги!
Спасибо
1 ответ
Сбой из-за того, что спецификатор формата%@ принимает объект и вызывает -(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%!