Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript BLOB的大小远远大于输入_Javascript - Fatal编程技术网

JavaScript BLOB的大小远远大于输入

JavaScript BLOB的大小远远大于输入,javascript,Javascript,我们通过拖放变量(使用dropzone.js-在这个阶段是base64加上指定文件类型的字符)来接收本地文件(通常是PDF、PNG或JPG)。我们将它(现在是二进制的)加密到一个javascript变量中。然后,我们使用该变量创建一个Blob,并将其上传到运行PHP的服务器。(见附件。) 我们发现blob的.size比我们正在上载的文件的.length大大约50%。(我们一直在通过转换为base64然后使用JSON上传来上传,但我们希望改变的一个原因是希望避免使用base64导致大小增加33%。

我们通过拖放变量(使用dropzone.js-在这个阶段是base64加上指定文件类型的字符)来接收本地文件(通常是PDF、PNG或JPG)。我们将它(现在是二进制的)加密到一个javascript变量中。然后,我们使用该变量创建一个Blob,并将其上传到运行PHP的服务器。(见附件。)

我们发现blob的.size比我们正在上载的文件的.length大大约50%。(我们一直在通过转换为base64然后使用JSON上传来上传,但我们希望改变的一个原因是希望避免使用base64导致大小增加33%。)

从中等尺寸到较大尺寸,水滴始终约大50%。作为一个小测试,我们使用120个字符作为输入创建了一个Blob,发现Blob.size为210。(我们通常使用正确的file.type;image/png只是将其解释为不需要编码的二进制数据。)根据代码中的实际使用:我们上传了一个900K PDF文件。类型类似于“application/pdf”。由此产生的水滴大约为1400k。也尝试了PNG

我认为Blob应该与输入大小相同,不是吗?我们可能做错了什么

new Blob(["123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"], {type:"image/png"});

有三个因素导致了规模的增加

我们的第一个问题是,我们正在使用FileReader读取文件。这将读取一个文件并在base64中对其进行编码,这将导致文件大小大约增加33%。我们改为并读入一个Uint8Array(一个8位字节的数组)

我们正在将文件传递给加密系统forge.js,而该系统只将数据作为字符串接收,因此我们必须将二进制ArrayBuffer转换为字符串。我们用了这个。更全面,参考了相对较新的TextEncoder/Decoder API。我们还没有开始使用它们。我想他们表现得更好,因为他们纯粹是本地人

一旦forge进行加密,我们就必须转换为Blob,因此请参见如何将ArrayBuffer转换为Blob和从Blob转换

其次,正如@TechnicalChaos所指出的,我们在javascript中使用了一个二进制字符串。由于javascript中的字符串是以2字节字符编码的,因此这种编码会导致它的大小变大

然后,blob可以附加到一个表单,并上传到我们的PHP服务器上的$\u文件中


现在,我们上传的文件与我们加密的文件大小大致相同。

我在将二进制数据放入Javascript blob时遇到了类似的问题-结果blob采用UTF-8编码,因此一些原始数据字节最终成为多字节字符


解决方案是将二进制数据的每个字节放入一个UINT8数组中,并将其传递给Blob。

我还没有计算,但Blob长度等于Blob.size—Blob的大小(以字节为单位),String.length是字符串中的字符数,但是,一个字符=2个字节。我知道,使用这种逻辑,blob.size将是字符串的两倍,但我会用谷歌搜索一下,然后再与您联系,但这必须是它的长短。对不起,.size是正确的属性名称。我将在上面更正它。我们通常不使用文本;我只是做了个快速测试。(我不确定默认情况下是否使用2字节/字符的编码,但我相信你的话。)通常我们的文件是PDF或PNG之类的。我也会说得更清楚一些。它们是等价的,所以无关紧要。然而,当我开始对您的示例字符串运行一些测试时,它的长度确实是210个字符,我无法在更短的字符串上复制这个问题。x=新的斑点([“123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012“])斑点{类型:,,大小:110,切片:功能}我的研究让我找到了这篇文章:磨练解决方案。这是在一个类似的方向,但使用锻造(我们正在使用)。如何将二进制数据放入Uint8Array?@L4reds:const raw=new Uint8Array(result.data.length);对于(设i=0;i