在JavaScript中比较文件对象

11

我在一个JS应用程序中有一个文件拖放区。我想要过滤掉重复的文件被拖入应用程序,但是我似乎找不到一种合适的方法来比较两个File对象指向相同的文件。所有我能找到的是通过“名称+文件大小+修改日期”组合进行比较,但它并不100%可靠,因为路径不会在name属性中显示。

我是否错过了某种方法?

2个回答

3
我知道回答来的有些晚,但我也遇到了同样的问题,或许还有其他人也是。我怀疑除了你正在使用的方法外,没有更好的方法。确实,这种方法不能百分之百地保证,因为你可能会有两个文件,它们的名称、大小和最后修改日期相同,但它们可能位于两个不同的文件夹中并且不同。如果你使用===比较File对象,当你选择两个不同的<input type="file">时,也会失败。我认为另一种方法是在你已经完成的基础上使用FileReader来比较文件内容。但这将非常耗费时间。"最初的回答"

1
2023年,我找到了一个在客户端比较两个文件的解决方案: (如果有更简单的解决方案,请纠正我)
将文件/ Blob 使用FileReader转换为ArrayBuffer,然后在缓冲区上进行逐字节检查。 然而,这些操作是异步且非常耗时的。您将不得不创建多个工具来处理回调和Promises。
最后,我只是使用了这个库:blob-compare (您可以看看它的工作原理:https://github.com/liqueurdetoile/blob-compare/blob/master/src/lib.js
您的代码将如下所示:
// util
import blobCompare from "blob-compare";

export const isFileEqual = async (file1, file2) => {
  return new Promise((resolve, reject) => {
    blobCompare.isEqual(file1, file2).then((result) => {
      resolve(result); // boolean
    }).catch(() => resolve(false));
  });
};

// usage
const file1, file2; // typeof File
if (await isFileEqual(file1, file2)) {
  // do something
}

如果你想在Array.filter()中使用这个功能,请看一下这个链接:使用返回promise的函数对数组进行过滤

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接