2012-09-18 96 views
0

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

至于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服务中的代码看起来像这样

[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服务中的一个字节[],具有完全相同的问题。如果我试图用unicode(比如UTF-8)以外的其他东西进行转换,那么数据会与原始数据完全不同,所以我认为om在这里是正确的,但有些不对。

回答

2

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

+1

感谢您的帮助!随着你的帮助和这篇文章[这里](http://stackoverflow.com/questions/7431365/filereader-readasbinarystring-to-upload-files)我发现,它的工作。 =) – einord