2010-05-25 5 views
4

오늘 저는이 작업을 몇 시간 동안 진행했으며 해결책을 찾지 못했습니다.하지만이 문제를 해결 한 사람의 도움이 필요합니다. iPhone에서 웹 서비스에 이미지를 게시하려고합니다. 먼저 코드를 게시하고 내가 시도한 모든 것을 설명해 드리겠습니다.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]; 
}  

우선이 코드는 이미지 외에는 아무 문제가 없습니다. 웹 서비스가 로컬 네트워크에서 실행 중이고 원하는대로 소스 코드를 변경할 수 있습니다. "ImgIn"매개 변수를 문자열로 변경하고 문자열을 전달하면 모든 것이 제대로 작동하므로 반환 값은 아무 문제가 없습니다. 따라서 연결 문제가 전혀 발생하지 않으며이 서버에서이 웹 서비스의 데이터를 호출하고 얻을 수 있습니다. 하지만 ImgIn 매개 변수를 통해이 웹 서비스에 이미지를 업로드해야하므로 위의 코드가 지금까지 내 최선의 결과입니다. 나는 또한 didReceiveResponse, didReceiveData, didFailWithError 등을 모두 처리했다. 위 코드는 매번 didRecieveResponse를 해제합니다. 그러나 didReceiveData는 결코 해고되지 않으며 웹 서비스 자체가 결코 실행되지 않는 것처럼 보입니다. 웹 서비스 자체를 디버깅 할 때 문자열 매개 변수를 사용하면 실행되고 디버그가 잘되지만 이미지 매개 변수를 사용하면 호출 할 때 디버깅조차하지 못합니다. 그것은 ImgIn 매개 변수가 너무 길어서 (화면에 출력 할 때 거대합니다.) 웹 서비스가 막 대단히 복잡합니다. 이 방법을 사용할 때 Base64로 인코딩해야한다는 내용을 읽었지만 어떻게 완료되었는지에 대한 좋은 링크를 찾을 수 없습니다. 그것이 내가 잘못하고있는 것이라면, "Base64를 사용해야합니다"가 아니라, 이것을 수행하는 방법에 관한 코드를 제공해 주실 수 있습니까? 정말로 이걸 어떻게 구현할 것인가? 예. 그것 이외에, 나는 잃어버린 것 같아, 나는 다른 모든 일을 올바르게하고있는 것처럼 보인다. 도와주세요!

감사

답변

6

은 % @ 형식 지정자 오브젝트를 받아 호출하기 때문에 실패 - 문자열로를 켭니다 (있는 NSString *)에 대한 설명을. - [NSData description]은 (ASCII) "123abc"에 대해 "< 31 32 33 65 66 67>"과 같은 것을 반환하므로 < 31 32 33 65 66 67>이 분명히 유효한 XML이 아닙니다. 문자열을 함께 붙이지 마십시오 (XML 삽입에 취약 할 것입니다).

내가 SOAP를 삭제하고 SOAP를 사용하려면 단지

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

을 사용하고 아마 당신을 위해 포장을 할 것입니다 오브젝티브 C의 SOAP 라이브러리가있다. 실패하면 xs : base64Binary (수동으로)를 지정하고 base64 인코딩 데이터를 사용할 수 있습니다. 이것들은 데이터를 33 % 더 크게 만들기 때문에 이상적이지 않습니다. 당신이 불행하다면, SOAP 라이브러리는 그것을 20000% larger으로 만들 것입니다!

+0

위대한 작품. 웹 서비스를 포기하고 웹 페이지에 게시해야했습니다. 도움에 감사드립니다. – AS2012

+0

@tc. : Ca 당신이 답변 한이 업로드 방법에 대한 코드를 게시하십시오. – Nit

관련 문제