【发布时间】:2009-08-03 19:04:22
【问题描述】:
我在上传文件的 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);
【问题讨论】:
-
我不知道 ColdFusion,所以我无法建议您如何通过任何构建库(如果存在)来处理它,但您需要 Base 64 解码器。 Base64 是一种数据编码方案,而不是文本编码方案……您可以使用 UTF8 或 ASCII 或任何其他 Base64 编码。查看上面的 wiki 页面:en.wikipedia.org/wiki/Base64
-
这确实是 CF 正在做的事情。不过,不推荐使用 ToBase64()。您可能应该使用 BinaryEncode()。见:cfquickdocs.com/cf8/#BinaryEncode
标签: asp.net string encoding coldfusion bytearray