2011-01-10 15 views
0

NSMutableURLRequestを使用して画像をWebサーバーにアップロードしています。私は自分のコードが安定していると思っていましたが、大部分のユーザーにとっては効果的でしたが、一部のユーザーは単に画像をアップロードできません。私のサーバーのログを見ると、時折参照していますNSMutableURLRequestで時折 "境界なし"エラーが発生する

ポストボディを構築する際に境界エラーを指摘する "行/目なしのmultipart/form-data POSTデータの不明な境界"警告。以下は

は、私が使用しているものです:

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]]; 
    } 

コードはPHPの警告に時間の100%を得たが、それはおそらく、すべての30または40のユーザーに一度発生した場合、私は理解することができます。ユーザーがこのエラーを受け取った場合、ユーザーは投稿しようとしているすべての画像に対して同じエラーを返します。

誰もがすぐに何かを見ることができますか、これが断続的な問題になる理由についての洞察はありますか?

答えて

0

問題は、この行とあったが判明:もちろん

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

それは次のようになります。

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

(ケースに注意してください)。しかし、これがなぜ少数のユーザーに対する要求を破ったのかまだ分かりません。

1

HTTPヘッダーフィールドは大文字と小文字を区別しないので、Content-Type,Content-typeまたはCONTENT-TYPEのいずれを使用していても差はありません。また、あなたの答えが、少数のユーザーしかこの問題を抱えていない理由を説明していません。

実際の経験に基づいて、欠落している境界については別の説明があります。いくつかの携帯データプロバイダ、特にボーダフォンは、さまざまなカスタムヘッダー(たとえばx-up-subno,HTTP_SM_MS_CRYPTEDなど)を追加するプロキシを介してすべてのHTTPリクエストをフィルタリングすることが判明しています。私は実際には、これらのプロキシのいくつかがmultipart/form-dataとして投稿されたフォームを網羅し、Content-Typeヘッダーの "境界"属性を削除しているため、ほぼすべてのサーバーでフォームを解析不能にしているという実在の証拠があります。

関連する問題