ファイルをアップロードする ASP.NET HTTPHandler のエンコーディングに何らかの問題があります。ファイルの内容は、「ToBase64」と呼ばれるものを使用している ColdFusion Web ページから非表示のフォーム変数に渡されます。
ColdFusion では、ファイルの内容をフォームに配置するために使用されるコードは次のとおりです。
<cffile action="readBinary" file="#FileName#" variable="objBinaryData">
<cfset b64file = #toBase64(objBinaryData)#>
<form name="sendToHandler"
action="http://myserver/mysite/UploadHandler.ashx" method="post">
<cfoutput>
<input type="hidden" name="objBinaryData" value="#b64file#" />
私の UploadHandler.ashx が投稿されると、次のようにフォームから文字列を取得しています。
string fileContent = context.Request.Form["objBinaryData"];
次に、次のように文字列をバイト配列に変換しています。
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
文字列を変換するために使用している関数は次のとおりです。
public static byte[] StringToByteArray(string str, EncodingType encodingType)
{
System.Text.Encoding encoding = null;
switch (encodingType)
{
case EncodingType.ASCII:
encoding = new System.Text.ASCIIEncoding();
break;
case EncodingType.Unicode:
encoding = new System.Text.UnicodeEncoding();
break;
case EncodingType.UTF7:
encoding = new System.Text.UTF7Encoding();
break;
case EncodingType.UTF8:
encoding = new System.Text.UTF8Encoding();
break;
}
return encoding.GetBytes(str);
}
public enum EncodingType
{
ASCII,
Unicode,
UTF7,
UTF8
}
EncodingType.ASCII を使用して上記の関数を呼び出すことが間違っていることは明らかですが、何が正しいのか非常に混乱していますか? ColdFusion から送信された「Base64」と、.Net で文字列をエンコードする方法との適切な「一致」は何ですか?
すべてのコードが「機能する」ことに注意してください。ただし、その後のファイルの取得では、ファイルがスクランブルされていることが示され、ここで間違ったエンコーディングを使用していると確信しています。
編集更新:
以前に省略した列挙コードを追加しました。これらのエンコーディング タイプはすべて試しました。それらはすべて「ガベージ」になります。つまり、次のバリエーションをそれぞれ試しました。
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
byte[] binData = StringToByteArray(fileContent, EncodingType.Unicode);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF7);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF8);
これらはどれも正しく機能しません。提案された関数を読んだところ、Unicode である必要があります。変換された文字列ではなく、バイト配列を返したいことに注意してください。まだ非常に混乱しています。
答え:
私は単純に列挙型と私が書いた StringToByteArray と呼ばれる関数を削除しました。代わりに、次のようにコーディングしました。
byte[] binData = Convert.FromBase64String(fileContent);