axios如何将blob与arraybuffer作为responseType?

问题描述 投票:0回答:1

我正在使用axios下载一个zip文件。为了进行进一步处理,我需要获取已下载的“原始”数据。据我所知,在Javascript中有两种类型:Blob和Arraybuffers。两者都可以在请求选项中指定为responseType

下一步,需要解压缩zip文件。我为此尝试了两个库:js-zip和adm-zip。两者都希望数据是一个ArrayBuffer。到目前为止,我可以将blob转换为缓冲区。转换之后,adm-zip总是很高兴提取zip文件。但是,除非已使用'arraybuffer'作为axios responseType下载了zip,否则js-zip会抱怨文件已损坏。 js-zip在从buffer取得的blob上不起作用。

这让我很困惑。我认为ArrayBufferBlob本质上只是底层内存上的视图。在下载内容作为Blob与缓冲区之间的性能可能有所不同。但是结果数据应该相同,对吗?

嗯,我决定尝试一下,发现了这一点:

如果指定responseType: 'blob',则axios将response.data转换为字符串。假设您对该字符串进行哈希处理并获得哈希码A。然后将其转换为缓冲区。对于此转换,您需要指定一种编码。根据编码的不同,您将获得各种新的哈希,我们将它们称为B1,B2,B3,...。在将'utf8'指定为编码时,我将返回原始哈希A。

所以我想以'blob'格式下载数据时,axios会将其隐式转换为使用utf8编码的字符串。这似乎很合理。

现在指定responseType: 'arraybuffer'。 Axios为您提供了一个缓冲区response.data。哈希缓冲区,您将获得哈希码C。此代码与A,B1,B2,...]中的任何代码都不对应。

因此,当将数据下载为'arraybuffer'时,会得到完全不同的数据吗?

现在,对于我来说,解压缩库js-zip抱怨如果数据以'blob'格式下载。它实际上可能以某种方式损坏了。但是,adm-zip如何提取它?我检查了提取的数据,它是正确的。对于这种特定的zip存档,可能仅是这种情况,但令我惊讶的是。

这是我用于实验的示例代码:

//typescript import syntax, this is executed in nodejs
import axios from 'axios';
import * as crypto from 'crypto';

axios.get(
    "http://localhost:5000/folder.zip", //hosted with serve
    { responseType: 'blob' }) // replace this with 'arraybuffer' and response.data will be a buffer
    .then((response) => {
        console.log(typeof (response.data));

        // first hash the response itself
        console.log(crypto.createHash('md5').update(response.data).digest('hex'));

        // then convert to a buffer and hash again
        // replace 'binary' with any valid encoding name
        let buffer = Buffer.from(response.data, 'binary');
        console.log(crypto.createHash('md5').update(buffer).digest('hex'));
        //...

是什么在这里造成了不同,以及如何获得“真实的”下载数据?

我正在使用axios下载一个zip文件。为了进行进一步处理,我需要获取已下载的“原始”数据。据我所知,在Javascript中有两种类型:Blob和...

javascript node.js axios blob arraybuffer
1个回答
1
投票

来自axios docs

© www.soinside.com 2019 - 2024. All rights reserved.