C# FileReader.readAsBinaryString是否返回二进制或基于ASCII的字符集?

C# FileReader.readAsBinaryString是否返回二进制或基于ASCII的字符集?,c#,javascript,asp.net,C#,Javascript,Asp.net,简而言之,我想将图像的二进制数据发送给我的处理程序,该处理程序将以字节数组的形式保存在数据库中。在我的Javascript中读取文件输入的值,得到如下输出: GIF89a,úæÿÿÿ2c½3fÌ Smaäµééúþc«T.[ÈéùAtεÚõ[ãXßÆî*[µc³8Ûõüÿfj¥æ§ÈïÛå÷ËØñI}ÓQ× *\»q£E}Ûÿå§ÓõþÿIÛv¤Þ´Åè«æ ³][us¬çAy×MÞ,a½«ÔóZÝL2äëùQ×(Eq<pË5V¨·ÏIÓ¨»åQßY¥3bØÈ æ¬z³é<uÓ3£

简而言之,我想将图像的二进制数据发送给我的处理程序,该处理程序将以字节数组的形式保存在数据库中。在我的Javascript中读取文件输入的值,得到如下输出:

GIF89a,úæÿÿÿ2c½3fÌ Smaäµééúþc«T.[ÈéùAtεÚõ[ãXßÆî*[µc³8Ûõüÿfj¥æ§ÈïÛå÷ËØñI}ÓQ×
*\»q£E}Ûÿå§ÓõþÿIÛv¤Þ´Åè«æ ³][us¬çAy×MÞ,a½«ÔóZÝL2äëùQ×(Eq<pË5V¨·ÏIÓ¨»åQßY¥3bØÈ
æ¬z³é<uÓ3£ÎñE¾á÷RÛR¢K­®ÎØØìÍAtÓÑÔØrÀ-hݪÑïôõüR|ÎäóÖUËåæçXÔw»^s®ëI}ÛQ}ÔEÛ·Îñ½Óêd»Ì
ÌëöåóôöÖàñE×Cr¿C¤3óúëLÍYÜ3fõûöÑðû Øûÿõw²ñ`ª»ßÀy|Á¿ÃIuÔM×ûñû{¹R4¼ìe¡äl«ç!ÿNETSCA
PE2.0!ÿXMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpm
eta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02
/06-14:56:27   // etc..  
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
GIF89a,úæÿÿÿ2c½3...
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsDataURL(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
这是一个二进制字符串?当我将这个字符串发送给我的处理程序(IHttpHandler)以将其存储到字节数组中时,如果我将编码设置为ISO-8859-1,则可能只获取字节

public void ProcessRequest (HttpContext aContext) 
{ 
    // This works as long as requestValidationMode = "2.0" in web.config
    // Is there a way to bypass HttpRequestValidationException  just on 
    // THIS data?
    byte[] imageBytes = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(_Context.Request["Image"]);

    //...
}

这正常吗?这还会引发HttpRequestValidationException(从..检测到一个潜在危险的Request.Form值)。我不想更改
requestValidationMode
,因为它向XSS开放,那么如何转义二进制字符串呢?Base64编码是否涵盖了这一点?如果是的话,从处理程序中的Base64转换是否包含有关其数据类型的元数据?

查看代码中的操作确实很有帮助,这就是为什么我希望您显示它。我猜您的代码如下所示:

GIF89a,úæÿÿÿ2c½3fÌ Smaäµééúþc«T.[ÈéùAtεÚõ[ãXßÆî*[µc³8Ûõüÿfj¥æ§ÈïÛå÷ËØñI}ÓQ×
*\»q£E}Ûÿå§ÓõþÿIÛv¤Þ´Åè«æ ³][us¬çAy×MÞ,a½«ÔóZÝL2äëùQ×(Eq<pË5V¨·ÏIÓ¨»åQßY¥3bØÈ
æ¬z³é<uÓ3£ÎñE¾á÷RÛR¢K­®ÎØØìÍAtÓÑÔØrÀ-hݪÑïôõüR|ÎäóÖUËåæçXÔw»^s®ëI}ÛQ}ÔEÛ·Îñ½Óêd»Ì
ÌëöåóôöÖàñE×Cr¿C¤3óúëLÍYÜ3fõûöÑðû Øûÿõw²ñ`ª»ßÀy|Á¿ÃIuÔM×ûñû{¹R4¼ìe¡äl«ç!ÿNETSCA
PE2.0!ÿXMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpm
eta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02
/06-14:56:27   // etc..  
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
GIF89a,úæÿÿÿ2c½3...
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsDataURL(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
现在当你说:

我将得到如下输出:

GIF89a,úæÿÿÿ2c½3fÌ Smaäµééúþc«T.[ÈéùAtεÚõ[ãXßÆî*[µc³8Ûõüÿfj¥æ§ÈïÛå÷ËØñI}ÓQ×
*\»q£E}Ûÿå§ÓõþÿIÛv¤Þ´Åè«æ ³][us¬çAy×MÞ,a½«ÔóZÝL2äëùQ×(Eq<pË5V¨·ÏIÓ¨»åQßY¥3bØÈ
æ¬z³é<uÓ3£ÎñE¾á÷RÛR¢K­®ÎØØìÍAtÓÑÔØrÀ-hݪÑïôõüR|ÎäóÖUËåæçXÔw»^s®ëI}ÛQ}ÔEÛ·Îñ½Óêd»Ì
ÌëöåóôöÖàñE×Cr¿C¤3óúëLÍYÜ3fõûöÑðû Øûÿõw²ñ`ª»ßÀy|Á¿ÃIuÔM×ûñû{¹R4¼ìe¡äl«ç!ÿNETSCA
PE2.0!ÿXMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpm
eta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02
/06-14:56:27   // etc..  
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
GIF89a,úæÿÿÿ2c½3...
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsDataURL(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
我的输出[…]二进制数据

是的,但是你可以读,所以是文本。二进制数据和文本数据之间的差异有点混淆,如果您想更混淆,请阅读。问题的原因是编码,正如那篇文章中所解释的

这取决于您将其输出到页面的方式,但浏览器可能会也可能不会对其接收的数据应用特定的编码(检查可以让您更多地了解通过HTTP线发送的内容),并将其显示为或多或少可读的文本

但这不适用于
图像
变量,该变量以“原始二进制数据[sic]”的形式包含结果中的实际二进制数据。哦,松散打印,谁在乎你返回什么。我想/希望是字节数组。您现在需要将其发送到服务器。文件上传最好由
元素处理,但有时需要使用AJAX。虽然据我所知,浏览器支持正在增加,但您确实可以通过JavaScript上传真正的文件

因此,您需要
POST
,将文件内容作为已发布表单的参数之一。为了在二进制数据中成功实现这一点,您需要为表单提交对其进行正确编码

首先确保请求是使用
应用程序/x-www-form-urlencoded
内容类型发出的。您可以在Fiddler或通过咨询。后者根本没有提到任何编码,您必须这样做

现在您需要修改二进制数据以便发布它。此函数将解释为UTF-8的输入字节返回为可以安全发布的URL编码字符串。然后服务器端,您可以替换

System.Text.Encoding.GetEncoding(“ISO-8859-1”).GetBytes(_Context.Request[“Image”])

.GetBytes(_Context.Request[“Image”])

但是,为什么文件的内容是这种形式呢?如上所述,
FileReader
还包含一个方法,允许您将
reader.result
直接用作
POST
变量

因此,您的代码如下所示:

GIF89a,úæÿÿÿ2c½3fÌ Smaäµééúþc«T.[ÈéùAtεÚõ[ãXßÆî*[µc³8Ûõüÿfj¥æ§ÈïÛå÷ËØñI}ÓQ×
*\»q£E}Ûÿå§ÓõþÿIÛv¤Þ´Åè«æ ³][us¬çAy×MÞ,a½«ÔóZÝL2äëùQ×(Eq<pË5V¨·ÏIÓ¨»åQßY¥3bØÈ
æ¬z³é<uÓ3£ÎñE¾á÷RÛR¢K­®ÎØØìÍAtÓÑÔØrÀ-hݪÑïôõüR|ÎäóÖUËåæçXÔw»^s®ëI}ÛQ}ÔEÛ·Îñ½Óêd»Ì
ÌëöåóôöÖàñE×Cr¿C¤3óúëLÍYÜ3fõûöÑðû Øûÿõw²ñ`ª»ßÀy|Á¿ÃIuÔM×ûñû{¹R4¼ìe¡äl«ç!ÿNETSCA
PE2.0!ÿXMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpm
eta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02
/06-14:56:27   // etc..  
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
GIF89a,úæÿÿÿ2c½3...
var f = $("image").files[0];
var reader = new FileReader();
reader.readAsDataURL(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});
然后在服务器端,您必须解码来自base 64的数据:

byte[] imageBytes = System.Convert.FromBase64String(_Context.Request["Image"]);

这是怎么回事?

还有另一种方式感谢你的回应,斯图尔特。我的问题是,我最初的“二进制字符串”并没有表示为1和0,而是上面的代码片段,我认为它显然不是二进制的。为什么
readAsBinaryString
会返回那样的值?这是我不熟悉的另一种二进制形式吗?对我来说,它看起来像是
Assembly
。这本身就是奇怪的。是的,那个字符串是正常的。。。如果要将字符串传递给处理程序,则应将其编码为base64,并在处理程序中将数据解码回。。。1和0用于汇编。。。像那样传递数据是低效的……足够公平了。如果我将其作为base64发送并解码,然后存储为字节数组,最终结果会包括数据的类型吗?这样,当我将来从DB检索数据时,它将知道它是否是png、gif等?+1感谢您的回答!不幸的是,我被指示通过线路发送二进制数据,而不使用base64编码,因为这样会导致负载膨胀。在发送之前,我正在对前端的图像进行编码。然而,我觉得奇怪的是,这可能是因为我对这个主题的理解很肤浅,当我在服务器端得到UTF8编码的字节时,剩下的字节数组长度是25,而图像是~40kB。如果不按原样编码和使用(从我的OP中),我只剩下约40k的字节数组长度,这是图像的大小,但出现了上述异常。很抱歉,不是25--159K经过进一步调查,我了解了更多。编码二进制数据似乎是必要的,是的,但会过度膨胀有效负载,从而导致159kB的大小。有没有一种方法可以按原样发送二进制数据而不进行编码?请知道,我们在后端有安全措施,可以确保图像的二进制数据有效。