2017-03-07 15 views
1

バイナリデータ(Excel XLSファイル)をHTTPマルチパートリクエストの一部として渡すことができるデータに変換しようとしています(複数パートを生成するコードリクエストは文字列データを使用していましたので、要求がどのように形成されているのではないかという問題であるバイナリデータのエンコーディングだと思います)。HTTPリクエスト用のバイナリ(Excel)データを文字列に変換する

decimal hex 
Ð 208  D0 
Ï 207  CF 
    17  11 
à 224  E0 
¡ 161  A1 
± 177  B1 
    26  1A 

私はその後、

content.Append(Encoding.UTF8.GetString(element.BinaryContent)); 
を使用する場合は

binaryContent = System.IO.File.ReadAllBytes(filePath); 

を使用してelement.BinaryContentを設定している:(++メモ帳のビューがとき)ですrefのために

Excelファイルの最初の7つの文字

これは(VSのイミディエイトウィンドウから)HTTP要求コンテンツを作成する場合:

binary content converted to UTF8

は、アップロードされたファイルでは制御文字と英語の文字が正しく保持されますが、他の文字は正しくない値に変換されます。

私はこれをうまく説明していないのですが、下の図は、左側にアップロードされたデータと右側がオリジナルです。参照のために

Comparison of files: before and after upload

、私が作るどのように要求は、これを使用している:requestContentはこのように、マルチパートの内容を正確に形成された

protected static void SetRequestContent(string requestContent, HttpWebRequest request, string contentType) 
    { 
     request.ContentType = contentType; 

     byte[] byteData = UTF8Encoding.UTF8.GetBytes(requestContent); 

     using (Stream postStream = request.GetRequestStream()) 
     { 
      postStream.Write(byteData, 0, byteData.Length); 
     } 
    } 

--------------------------BNDY 
Content-Disposition: form-data; name=password 
Txxxxx 
--------------------------BNDY 
Content-Disposition: form-data; name=username 
[email protected] 
--------------------------BNDY 
Content-Disposition: form-data;name=\"FILE\";filename=\"c:/POSTOutput/Upload.xls\" 
��\u0011\u0871\u001a�\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>\0\u0003\0��\t\0\u0006\0\0\0\0\0\0\0\0\0\0\0\u0001\0\0\0\u0001\0\0\0\0\0\0\0\0\u0010\0\0\u0002\0\0\0\u0001\0\0\0����\0\0\0\0\0\0\0\0������������ (etc). 

何データを元の形式で渡す必要がありますか?

+0

私の知る限り、マルチパートチャンクは、通常、BASE64でエンコードされ – dlatikay

答えて

0

あなたのコード行

content.Append(Encoding.UTF8.GetString(element.BinaryContent)); 

は(なし固有の文字エンコーディングのバイナリファイルから)任意のバイト列は常にUnicode文字列に変換できることを前提としています。これはそうではありません。documentation - 未定義のコードポイントは、置換(フォールバック)を引き起こすか、ArgumentExceptionを引き起こす可能性があります。サブパート(xlsファイル用アプリケーション/ vnd.ms-エクセルのtype属性を使用してMIMEタイプを指定します。

content.Append(Convert.ToBase64String(element.BianryContent)); 

さらに良い:あなたは文字列を持たなければならない場合

、代わりにbase64のような強力なエンコーディングを使用、xlsxとは異なります)、エンコードする必要は全くありません。生のバイトシーケンスをストリームに直接送信してください。

参照:
- Using HttpWebRequest to POST data/upload image using multipart/form-data

関連する問題