2011-01-20 17 views
4

マルチパート/フォームデータのコンテンツタイプを使用してファイルを投稿しようとしていますが、この質問があります:
CRLFをエスケープしないでください。私はファイルの内容を書きますか?私は、ウェブ上のコード部分を持って、私はそれが間違っているかもしれないと思う:HTTPマルチパート/フォームデータコンテンツタイプ(iOS)でCRLFをエスケープする

NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: url]; 
[req setHTTPMethod: @"POST"]; 

NSString* contentType = @"multipart/form-data, boundary=AaB03x"; 
[req setValue:contentType forHTTPHeaderField: @"Content-type"]; 

NSData* boundary = [@"\r\n--AaB03x\r\n" dataUsingEncoding:NSUTF8StringEncoding]; 
NSMutableData *postBody = [NSMutableData data]; 
[postBody appendData: boundary]; 
[postBody appendData: [@"Content-Disposition: form-data; name=\"datafile\"; filename=\"t.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData: [@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[postBody appendData: imageData]; 
[postBody appendData: boundary]; 
[req setHTTPBody:postBody]; 

画像データは右、\ rをする\ nの配列を含む可能性があるため、これは間違っていますか?もしそうなら、生データのCRLFをエスケープする方法はありますか?または私は何かを逃していますか?

ありがとうございます!

答えて

3

これは興味深い質問です。 multipart media type RFCを見ると、境界がカプセル化されたデータに現れないことを確認するのは合成エージェント次第です。また、それは次のように述べている:

注:境界区切り文字は がカプセル化されている体の部分に表示されていなければならないので、ユーザエージェントは ユニークな境界パラメータ値を選択するように注意を払う必要があります。上の例の の境界パラメータの値は、 のデータを事前走査することなく、カプセル化されるデータ内にすでに という非常に低い確率で境界デリミタを生成するように設計されたアルゴリズムの結果であった可能性があります。

これは、境界値がカプセル化されたデータに表示されないようにするために、境界値のデータをスキャンする必要があると解釈されます。ほとんどの場合、これは許容できないほど高価な操作なので、ユーザーエージェントはデータ内で発生する確率が非常に低い値を選択するだけです。

あなたの例の境界がランダムなバイト列で発生する確率を考慮してください(引数として、JPEG画像を表すと仮定します)。画像データを早く終了させるために一致させる必要がある文字列は、 "\ r \ n - AaB03x" - 10バイト、つまり80ビットです。どんなビットから始めても、次の10バイトがそのシーケンスである可能性は2^80の1つです。 1MBのJPEGファイルには、2^23ビットがあります。これは、シーケンスを含むJPEGファイルの可能性が2^23/2^80より小さいか、2^57(1百万以上)の1つであることを意味します。

私は答えが100%であることを確かめるために、境界シーケンスのデータをチェックして、境界シーケンスがデータに存在する場合は別のものを使用する必要があると思います。しかし、実際には、発生する境界シーケンスの可能性は十分に小さいので、それはそれに値するものではありません。

関連する問題