将二进制(Excel)数据转换为HTTP请求的字符串

时间:2017-03-07 17:56:12

标签: c# http encoding character-encoding binary

我正在尝试将二进制数据(Excel XLS文件)转换为我可以作为HTTP多部分请求的一部分传递的数据(生成多部分请求的代码已经使用字符串数据一段时间了我认为二进制数据的编码不是请求的形成问题。

对于ref,Excel文件的前七个字符(在Notepad ++中查看时)是:

    decimal hex
Ð   208     D0  
Ï   207     CF  
   17      11  
à   224     E0  
¡   161     A1  
±   177     B1  
    26      1A  

我正在使用

设置element.BinaryContent
binaryContent = System.IO.File.ReadAllBytes(filePath);

如果我然后使用

content.Append(Encoding.UTF8.GetString(element.BinaryContent));

创建它给出的HTTP请求内容(来自VS中的立即窗口):

binary content converted to UTF8

在上传的文件中,控制字符和英文字符被正确保留,但其他字符将转换为不正确的值。

如果我没有很好地解释这一点,下面的图片会显示左侧上传的数据和右侧的原始数据。

Comparison of files: before and after upload

对于ref,我如何使用此命令:

    protected static void SetRequestContent(string requestContent, HttpWebRequest request, string contentType)
    {
        request.ContentType = contentType;

        byte[] byteData = UTF8Encoding.UTF8.GetBytes(requestContent);

        using (Stream postStream = request.GetRequestStream())
        {
            postStream.Write(byteData, 0, byteData.Length);
        }
    }

其中requestContent具有正确形成的多部分内容,如下所示:

--------------------------BNDY
Content-Disposition: form-data; name=password
Txxxxx
--------------------------BNDY
Content-Disposition: form-data; name=username
a@b.com
--------------------------BNDY
Content-Disposition: form-data;name=\"FILE\";filename=\"c:/POSTOutput/Upload.xls\"
��\u0011\u0871\u001a�\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>\0\u0003\0��\t\0\u0006\0\0\0\0\0\0\0\0\0\0\0\u0001\0\0\0\u0001\0\0\0\0\0\0\0\0\u0010\0\0\u0002\0\0\0\u0001\0\0\0����\0\0\0\0\0\0\0\0������������ (etc). 

以原始格式传递数据需要做什么?

1 个答案:

答案 0 :(得分:0)

您的代码行

content.Append(Encoding.UTF8.GetString(element.BinaryContent));

假设任意字节序列(来自没有固有字符编码的二进制文件)始终可以转换为Unicode字符串。情况并非如此:documentation - 未定义的代码点可能会导致替换(回退)甚至导致ArgumentException

如果您必须有字符串,请使用类似base64的强大编码:

content.Append(Convert.ToBase64String(element.BianryContent));

更好:使用子部分的type属性指定MIME类型(xls的application / vnd.ms-excel,xlsx不同),因此您根本不需要编码,并提交原始字节序列直接到流。

参考文献:
- Using HttpWebRequest to POST data/upload image using multipart/form-data