如何比较 JavaScript 中的两个 blob?

Posted

技术标签:

【中文标题】如何比较 JavaScript 中的两个 blob?【英文标题】:How to compare two blobs in JavaScript? 【发布时间】:2016-12-20 19:49:45 【问题描述】:

我使用下面的代码在 javascript 中加载了两个 blob 文件。

我想比较一下它们是否完全相同。

(blob1 === blob2) 返回 false,即使每个 blob 的报告大小为 574 字节。我做错了什么?

  getHTTPAsBlob(url, callback) 
    let cacheBust = Math.random().toString()
    url = url + '?&cachebust=' + cacheBust
    let xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.onload = function (e) 
      if (xhr.status == 200) 
        // get binary data as a response
        let fileData = this.response;
        let contentType = xhr.getResponseHeader("content-type")
        var reader = new FileReader()
        reader.onload = (e) => 
          console.log(reader.result)
          console.log(fileData)
          callback(null, 
              Body: reader.result,
              Blob: fileData,
              ContentType: contentType,
              Etag: null,
              LastModified: null,
            )
        
        reader.readAsText(fileData)
         else 
        callback(xhr)
      
      
      xhr.send();
    

【问题讨论】:

如果你想比较它的内容(使用 FileReader),我认为你必须阅读“blob”。将 responseType 设置为“arraybuffer”不是更容易吗,尤其是如果它们很小的话? 如果您查看我的代码,您会发现它使用文件读取器从 blob 中获取文本,但这不是重点,比较两个 blob 不需要读取。 @DukeDugal:为什么不需要阅读来比较两个 blob?如果不是通过内容,您还想如何比较它们? 【参考方案1】:

我认为“blob compare”插件会对您有所帮助。 它可以比较 blob 的大小、类型等。 https://www.npmjs.com/package/blob-compare

但我不知道这个插件是不是完美的方式。

【讨论】:

【参考方案2】:

您必须使用 FileReader 来比较它们

FileReader 的文档位于 MDN。看看如何选择最适合您的数据的方法。

比较两个 blob 的无用方法是查看它们的大小。尽管无论内容如何,​​两个大小相同的 blob 都会返回 true。

示例

new Blob([Math.random()]).size == new Blob([Math.random()]).size // true.

【讨论】:

【参考方案3】:

不幸的是,这是比较两个引用可比较内容的完全独立指针的情况。要了解这对更简单的内容如何起作用,请在 javascript 控制台中尝试以下操作:

new Number(5) == new Number(5)

返回假。令人沮丧的是,5 作为一个对象并不等于一个值为 5 的对象。但至少这将 Blob 置于上下文中。

我遇到了同样的问题,并且同意之前的建议,即 FileReader 是唯一的选择。

【讨论】:

以上是关于如何比较 JavaScript 中的两个 blob?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 javascript 中的 URL 获取 File() 或 Blob()?

如何在本机反应中制作javascript图像blob对象?

javascript blob 中的换行符未呈现

Javascript - 如何知道Fetch API中的响应类型?

如何在 JavaScript 中检查变量是不是为 blob

如何在 JavaScript 中将 Blob 转换为文件