gpt4 book ai didi

javascript - 如何检测不同的 File 对象引用同一个文件?

转载 作者:搜寻专家 更新时间:2023-11-01 04:39:33 27 4
gpt4 key购买 nike

<input id='f' name='f' multiple />

我允许用户选择多个文件(来自不同文件夹)进行上传。我按照描述构建了所选文件列表 here .基本上,所选文件的列表在 INPUT 控件之外进行维护,并在提交时塞回 f.files

每次用户选择一个文件时,所选文件的列表都是从 f.files 数组中的 File 对象构建的。

到目前为止,这很好用,除了我无法检测到所选的重复文件。 f.files 只包含文件名,不包含完整路径。

我在 File 对象上应用了 URL.createObjectURL,但每次都是不同的 url,即使是同一个文件也是如此。

(在 Chrome 中,如果连续选择同一个文件,上传控件将不会触发 change 事件。但这对我来说还不够,因为用户可以选择文件 A,然后文件 B,然后再次文件 A。)

如何识别 File 对象中的重复文件?

最佳答案

您可以使用 FileReader.readAsDataURL()读取每个文件的内容。

然后您可以将文件内容与每个文件的其他属性进行比较,包括 File.lastModified , File.name , File.size , 和 File.type以确定文件是否重复。

完整示例:

const file_input = document.getElementById( 'f' );

file_input.addEventListener( 'change', () =>
{
const file_compare = [];

Array.from( file_input.files ).forEach( file =>
{
const file_reader = new FileReader();

file_reader.readAsDataURL( file );

file_reader.addEventListener( 'load', () =>
{
const file_exists = file_compare.find( existing_file =>

existing_file.lastModified === file.lastModified
&& existing_file.name === file.name
&& existing_file.size === file.size
&& existing_file.type === file.type
&& existing_file.content === file_reader.result

) !== undefined;

if ( file_exists )
{
console.log( 'Error:', file.name, 'is a duplicate file.' );
}

else
{
file_compare.push(
{
'lastModified' : file.lastModified,
'name' : file.name,
'size' : file.size,
'type' : file.type,
'content' : file_reader.result
});
}
});
});
});
<input id="f" name="f" type="file" multiple />

Note: If you are dealing with very large files, you can limit the comparisons to File.lastModified, File.name, File.size, and File.type as a performance enhancer.

关于javascript - 如何检测不同的 File 对象引用同一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52088979/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com