我在上传文件的 ASP.NET HTTPHandler 中遇到了某种编码问题。文件内容是从一个使用名为“ToBase64”的 ColdFusion 网页的隐藏表单变量中传递的。
在 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);