在工作中,我们尝试在浏览器端使用 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).
}
我们手动发布数据而不是借助 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 服务中再次转换为 byte[],但存在完全相同的问题。如果我尝试使用 unicode 以外的任何内容(例如 UTF-8)进行转换,则数据会与原始数据完全不同,因此我认为 om 在这里是正确的,但有些地方略有错误。
最佳答案
请求本身是文本,因此如果发送错误的 enc-type,二进制数据就会丢失。
您可以做的是将二进制编码为 Base64 并在另一端对其进行解码。
要将 enc-type 更改为多部分/混合并设置边界(就像电子邮件或其他内容),您必须自己组装请求。
关于javascript sendfile 二进制数据到 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12479273/