使用IE11的工作人员使用multipart / form-data发送二进制数据

时间:2015-01-13 11:41:43

标签: file-upload binary internet-explorer-11 multipartform-data worker

我正在尝试使用IE从工作人员发送multipart/form-data。我已经使用formData对象使用Chrome,Firefox,Safari完成了它(不支持IE,我需要手动的)

我发送的二进制数据是加密数据加密数据。使用formData个对象:

var enc = new Buffer(encrypted.ciphertext.toString(CryptoJS.enc.Base64), 'base64');
formData.append("userFile" , new Blob([finalEncrypted], {type: 'application/octet-binary'}), 'encrypted')
this works fine generating a multipart like this(missed some parts of it):

请求标题:

Accept:*/*
Accept-Encoding:gzip, deflate
Cache-Control:no-cache
Connection:keep-alive
Content-Length:30194
Content-Type:multipart/form-data; boundary=WebKitFormBoundary0.gjepwugw5cy58kt9

体:

--WebKitFormBoundary0.gjepwugw5cy58kt9
Content-Disposition: form-data; name="userFile"; filename="encrypted"
Content-Type: binary

所有二进制数据

--WebKitFormBoundary0.cpe3c80eodgc766r--

使用手册multipart/form-data

IE11 doesn't accept readAsBinaryString(deprecated)

我想避免发送base64编码数据(readAsDataURL)(33%有效载荷)

我发送的二进制数据是加密数据加密数据。 我在尝试:

finalEncrypted = new Buffer(encrypted.ciphertext.toString(CryptoJS.enc.Base64), 'base64');

然后在我的手动多部分中,我尝试将缓冲区转换为二进制字符串:

item.toString('binary')

多部分结果看起来像这样:

--WebKitFormBoundary642013568702052
Content-Disposition: form-data; name="userfile"; filename="encrypted"
Content-Type: binary

所有二进制数据

ÐçÀôpRö3§]g7,UOÂmR¤¼ÚS"Ê÷UcíMÆÎÚà/,hy¼øsËÂú@WcGvºÆÞ²i¨¬Ç~÷®}éá?'é·J]þ3«áEÁÞ,4üBçðºÇª bUÈú4
T\Ãõ=òEnýR  _[1J\O-ïǹ C¨\Ûøü^%éÓÁóJNÓï¹LsXâx>\aÁV×Þ^÷·{|­'

在.NET服务器上,我们检查在客户端计算的哈希与在服务器上计算的哈希。哈希的服务器回复不匹配。这让我觉得我没有正确发送文件。

1 个答案:

答案 0 :(得分:0)

看起来你还没有得到解决方案,至少你没有在这里发帖,如果你有的话。

在我的结尾,我使用jQuery来处理实际帖子的低级细节。

可能是你做了一件小事而且IE失败了。因为您没有显示您使用FormData的内容。很难看出你是否犯了错误。

// step 1. setup POST data
var data = new FormData();
data.append("some_variable_name", "value_for_that_variable");
data.append("some_blob_var_name", my_blob);
data.append("some_file_var_name", my_file);

// step 2. options
var ajax_options =
    {
        method: "POST",
        processData: false,
        data: data,
        contentType: false,
        error: function(jqxhr, result_status, error_msg)
        {
            // react on errors
        },
        success: function(data, result_status, jqxhr)
        {
            // react on success
        },
        complete: function(jqxhr, result_status)
        {
            // react on completion (after error/success callbacks)
        },
        dataType: "xml" // server is expected to return XML only
    };

// step 3. send
jQuery.ajax(uri, ajax_options);

第1步。

创建一个FormData对象并填充表单数据,其中包括变量和文件。您甚至可以添加 blob (如果我正确的话,JavaScript对象将转换为JSON。)

第2步。

根据自己的喜好创建ajax_options对象。虽然在这里我会显示methodprocessDatadatacontentType,因为它们必须是您要发送FormData的情况。至少,这对我有用......可能会改变其中的一些价值观。

dataType应设置为您期望的任何类型。

第3步。

使用jQuery库中的ajax()函数发送请求。它将根据客户端浏览器的需要构建正确的标题和结果。