2011-11-16 2 views
1

setHTTPBody 대신 NSMutableURLRequest를 사용하여 setHTTPBodyStream을 사용하는 데 문제가 있습니다.NSMutableURLRequest를 사용하여 http post를 통해 파일을 전송할 때 네트워크 오류가 발생했습니다.

http 게시를 통해 서버에 큰 파일을 보내려면 코드 작업을하고 있습니다. 다음 부분 코드로, 모든 것을 완벽하게 작동합니다 :

NSData * mydata = [NSData dataWithContentsOfFile:self.tmpFileLocationToUpload]; 
[request setHTTPBody:mydata]; 

내가 그것을 변경하는 경우 :

NSData * mydata = [NSData dataWithContentsOfFile:self.tmpFileLocationToUpload]; 
self.tmpInputStream = [NSInputStream inputStreamWithData:mydata]; 
[request setHTTPBodyStream: self.tmpInputStream]; 

그럼 난 항상 네트워크 오류로 종료 : 오류 - 작업을 완료 할 수 없습니다. (kCFErrorDomainCFNetwork 오류 303)

목표는 메모리에서로드하지 않고 큰 파일을 보낼 수 있도록 파일에서 직접 inputStrem을 만드는 것입니다.

setHTTPBodyStream을 사용하여 뭔가를 놓쳤습니까?

도움 주셔서 감사합니다.

감사합니다. 세바스찬.

답변

1

HTTP 메소드를 설정해보십시오 (아직 설정하지 않은 경우). 나는 추가하여 "kCFErrorDomainCFNetwork 오류 303"오류를 수정 할 수 있었다 :

[request setHTTPMethod:@"POST"]; 
1

당신이 setHTTPBody를 사용하여 자동으로 요청의 Content-length 헤더를 설정하지만 당신이 setHTTPBodyStream를 사용하는 경우, 그것은하지 않고,하지 은 chunked입니다. 스트림의 길이를 미리 결정할 수없는 경우에는 chunked 전송 인코딩이 사용됩니다. setHTTPBodyStream와 함께 NSURLConnection를 사용하는 경우 수동 Content-length을 설정할 수 있습니다

(. Chunked transfer encoding 참조)과는 chunked의를 방지 할 수 있습니다 (당신이 사전에 길이를 알고 가정) :

NSString *contentLength = [NSString stringWithFormat:@"%d", [mydata length]]; 
[request setValue:contentLength forHTTPHeaderField:@"Content-length"]; 

NSURLSession를 사용하는 경우 청크 요청과 함께 수동으로 Content-length을 설정하면 시도가 chunked 요청이되지 않을 수 있습니다.

관련 문제