У меня возникла какая-то проблема с кодировкой в моем ASP.NET HTTPHandler, который загружает файл. Содержимое файла передается в скрытой переменной формы с веб-страницы ColdFusion, которая использует нечто, называемое «ToBase64».
В 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 неправильный, но я очень озадачен тем, что было бы правильно? Каково надлежащее «совпадение» между «Base64», отправленным из ColdFusion, и способом кодирования строки в .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);