javascript sendfile二进制数据到Web服务

时间:2012-09-18 14:39:10

标签: javascript web-services html5 filereader

在工作中,我们尝试使用浏览器端的html 5 / javascript和Web服务中的C#将文件从网页上传到Web服务。但是对某种编码有些麻烦。

对于javascript,我们在FileReader的帮助下获取文件的二进制数据。

var file = ... // gets the file from an input
var fileReader = new FileReader();
fileReader.onload = dataRecieved;
fileReader.readAsBinaryString(file);

function dataRecieved() {
  // Here we do a normal jquery ajax post with the file data (fileReader.result).
}

Wy我们手动发布数据,而不是来自XmlHttpRequest(或类似)的帮助,以便更轻松地从网页的不同部分向我们的Web服务发布(它包含在一个函数中)。但这似乎不是问题。

Web Service中的代码如下所示

[WebMethod]
public string SaveFileValueFieldValue(string value)
{
  System.Text.UnicodeEncoding encoder = new UnicodeEncoding();
  byte[] bytes = encoder.GetBytes(value);
  // Saves file from bytes here...
}

一切正常,数据似乎正常,但在尝试打开文件(图像为例)时无法打开。非常基本的文本文件似乎没问题。但是,如果我上传一个像文件一样的“二进制”文件,然后在普通文本编辑器中打开原始文件和上传版本作为记事本,看看有什么不同,那么只有少数几个“看不见”的字符似乎是错误的。从一开始就显示为几个字节的新行。

基本上,该文件在转换中的某处似乎只编码了几个字节错误。

我还试图从数据中创建一个javascript的int数组,然后再次转换为Web服务中的byte [],问题完全相同。如果我尝试使用unicode之外的其他任何东西进行转换(如UTF-8),那么数据与原始数据完全不同,所以我认为这里的轨道正确,但有些错误。

1 个答案:

答案 0 :(得分:2)

请求本身是文本,因此如果发送错误的enc类型,二进制数据将丢失。 您可以做的是将二进制编码为base64并在另一侧对其进行解码。
要将enc-type更改为多部分/混合并设置边界(就像电子邮件或其他东西),您必须自己组装请求。