2011-01-10 3 views
0

NSMutableURLRequest를 사용하여 이미지를 웹 서버에 업로드하고 있습니다. 내 코드는 대다수 사용자에게 적합하기 때문에 안정적이라고 생각했지만 일부 사용자는 이미지를 업로드 할 수 없습니다. 내 서버 로그를 보면 게시물 본문을 구성 할 때 경계 오류를 가리키는 경고 인 "0 행의 알 수없는 상태에서 multipart/form-data POST 데이터의 누락 된 경계"경고가 표시되는 경우가 종종 발생합니다.NSMutableURLRequest와 함께 때때로 "경계 없음"오류가 발생했습니다.

다음은

내가 사용하고 무엇을 : 코드가 시간의 PHP 경고 100 %의 결과 경우

request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPMethod:[method uppercaseString]]; 

NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data, boundary=%@", boundary]; 

[request setValue:contentType forHTTPHeaderField:@"Content-type"]; 
NSMutableData *postBody = [NSMutableData data]; 

// add the image 
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"Content-Disposition: form-data; name=\"image_upload\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
NSData *jpegData = UIImageJPEGRepresentation(jpeg, 100); 
[postBody appendData:jpegData]; 
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

// add the other POST params 
keys = [postdata allKeys]; 
int l = [keys count]; 
for (int i=0; i<l; i++){ 
    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", [keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postBody appendData:[[postdata objectForKey:[keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 

내가 이해할 수 있지만, 아마도 매 30 또는 40 사용자가 한 번 발생합니다. 사용자가이 오류를 받으면 게시하려는 모든 이미지에 대해 동일한 오류가 발생합니다.

누구나 즉시 명백한 것을 볼 수 있습니까? 또는 이것이 간헐적 인 문제가되는 이유에 대한 통찰력이 있습니까?

답변

0

문제가이 줄을이었다 끈다 : 물론

[request setValue:contentType forHTTPHeaderField:@"Content-type"]; 

이 있어야한다 :

[request setValue:contentType forHTTPHeaderField:@"Content-Type"]; 

(경우에주의). 그러나 이것이 왜 소수의 사용자에 대한 요청을 어긴 이유는 확실하지 않습니다.

1

HTTP 헤더 필드는 대소 문자를 구분하지 않으므로 Content-Type, Content-type 또는 CONTENT-TYPE을 사용하든 상관 없습니다. 또한 소수의 사용자 만이 문제를 겪은 이유에 대한 대답은 설명하지 않습니다.

실제 경험을 바탕으로 한 누락 된 경계에 대해 다른 설명이 있습니다. Vodafone과 같은 일부 셀룰러 데이터 공급자는 다양한 사용자 지정 헤더 (예 : x-up-subno, HTTP_SM_MS_CRYPTED 및 기타)를 추가하는 프록시를 통해 모든 HTTP 요청을 필터링합니다. 나는 그 프록시들 중 일부가 multipart/form-data으로 게시 된 양식을 엉망으로 만들고 Content-Type 헤더의 "경계"속성을 제거하고 거의 모든 서버에 대해 양식을 해석 할 수 없도록 만드는 실제적인 증거가 있습니다.