【问题标题】:How can I see if two File objects refer to the same physical file using JavaScript?如何使用 JavaScript 查看两个 File 对象是否引用同一个物理文件?
【发布时间】:2014-01-27 20:22:41
【问题描述】:

我正在使用表单上传多个文件。我有以下内容:

<input id="files" name="files[]" type="file" value="Add files..." multiple/>
<input id="addfiles" value="Add" type="button"/>

$("#addfiles").click(function() {
    f = $("#files").prop("files");
    for (index = 0; index < f.length; ++index) {
        if (!is_in_queue(f[index]))
        {
            queue.push(f[index]);
[...]

如何比较两个 File 对象?我需要对is_in_queue 进行比较。不幸的是,我只看到设置了 name 属性,但没有设置路径(它是空的)。这意味着基于name 的比较对于不同路径中具有相同名称的文件将失败。

更新:理想情况下,我希望在客户端完成此操作。用户在上传之前需要为每个上传的文件设置一些参数,我想避免重复这个工作量。

【问题讨论】:

  • 也许保留内容的哈希或校验和并与之匹配? How to calculate md5 hash of a file using javascript
  • 这是一个想法。但理论上,两个不同的文件可能具有相同的内容(尽管不太可能)。
  • 也许保留名称和校验和,只是希望file.txt 不会同时出现在两个地方?再说一遍 - 如果他们确实有相同的内容,那不是你想要避免的吗? :)
  • @h2ooooooo:你说得对,谢谢
  • 不,不是。我试图避免两次将相同的文件添加到队列中。

标签: javascript html file-upload


【解决方案1】:

我认为最好的方法是同时上传用户想要上传的所有文件。当然,应在应用程序的后端逻辑的服务器端检查双精度数。

这里是一个帮助您入门的链接:http://www.html5rocks.com/en/tutorials/file/dndfiles/

编辑: 正如@ikaros45 所说,最好的办法是检查文件的 MD5 哈希值。但是这些都保存在数据库中的服务器端,因此您需要请求它们或有一个处理程序来检查要上传的文件的 MD5 哈希是否已经存在。 这是有关该问题的另一个链接:How to calculate md5 hash of a file using javascript 这就是您可以为客户端做的事情。由于 JavaScript 非常有限,因此很难在浏览器中执行与文件相关的操作。此外,通过使用 FileAPI,您可以将您的 Web 应用程序限制为仅使用最新的浏览器版本。

【讨论】:

  • 理想情况下,我想做这个客户端。用户必须为他上传的每个文件设置一些参数,我想避免重复工作量。
  • 我认为这是正确的方法。将所有内容推送到服务器并在那里检查。否则你必须在服务器计算哈希(例如md5),发送到客户端,并在客户端用JS计算哈希(我不知道是否可能)。
  • 不幸的是,哈希没有帮助(请参阅问题的 cmets)。
  • 还添加文件的大小。两个文件具有相同散列和大小的机会非常低。 Dropbox 也使用 hasing 机制来检测数据重复。这就是他们会警告您上传版权名称与原始名称不同的歌曲的方式。
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
相关资源
最近更新 更多