File upload 使用IE11工作程序的多部分/表单数据发送二进制数据

File upload 使用IE11工作程序的多部分/表单数据发送二进制数据,file-upload,binary,internet-explorer-11,multipartform-data,worker,File Upload,Binary,Internet Explorer 11,Multipartform Data,Worker,我正在尝试从IE的工作人员那里发送一个多部分/表单数据。我已经使用表单数据对象在Chrome、Firefox和Safari上完成了这项工作(不支持IE,我需要手动) 我发送的二进制数据是加密的js加密数据。对于formData对象,我会: var enc = new Buffer(encrypted.ciphertext.toString(CryptoJS.enc.Base64), 'base64'); formData.append("userFile" , new Blob([finalEn

我正在尝试从IE的工作人员那里发送一个
多部分/表单数据
。我已经使用
表单数据
对象在Chrome、Firefox和Safari上完成了这项工作(不支持IE,我需要手动)

我发送的二进制数据是加密的js加密数据。对于
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.cpe3c80eodgc766r--
ÐçÀô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×Þ^÷·{|­'
使用手册
多部分/表单数据

IE11 doesn't accept readAsBinaryString(deprecated)
我希望避免发送base64编码数据(readAsDataURL)(33%有效负载)

我发送的二进制数据是加密的js加密数据。 我正在努力:

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
所有二进制数据

--WebKitFormBoundary0.cpe3c80eodgc766r--
ÐçÀô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服务器上,我们检查在客户端计算的哈希值与在服务器上计算的哈希值。哈希不匹配的服务器回复。这让我觉得我没有正确发送文件。

看起来你还没有找到解决方案,至少如果你有解决方案,你没有在这里发布

在我这方面,我使用jQuery来处理实际帖子的底层细节

可能是你做错了一件小事。因为您没有显示使用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);
第一步

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

第二步

根据您的喜好创建一个
ajax\u options
对象。虽然我在这里展示了
方法
处理数据
数据
内容类型
,但它们必须是在您想要发送
表单数据
的情况下。至少,这对我有用。。。可能会更改其中一些值

数据类型应设置为您期望返回的任何类型

第三步


使用jQuery库中的函数发送请求。它将根据客户端浏览器的需要生成适当的标题和结果。

回到这个问题,我决定将处理过的数据放回工作人员,如果用户是IE,然后从那里发送。因此,对于我的加密内容:
code
newbuffer(encrypted.ciphertext.toString(CryptoJS.enc.Base64),'Base64')
code
回到这个问题,如果用户是IE,我决定将处理过的数据放回工作者,并从那里发送。因此,对于我的加密内容:
var e=new Buffer(encrypted.ciphertext.toString(CryptoJS.enc.Base64),'Base64')//如果不是,我使用的是browserify:var e=new Uint8Array(encrypted.ciphertext.toString(CryptoJS.enc.Base64)。Buffer var toExport=new Blob([e],{type:'application/octet binary'))
ie11在工作人员的blob上有一些bug……这样IE就会耗尽内存:(