如何在下载之前从URL检查重复文件



我有成千上万的图像在我的电脑上的文件夹,我正试图找出我如何能检查从给定的URL文件是否已经下载。这可能吗?

这只给我文件的大小。

URL url = new URL("http://test.com/test.jpg");
url.openConnection().getContentLength();
对于重复的文件,我使用
FileUtils.contentEquals(file1, file2)

谢谢你的回答!

如果您有一个基本URL并且存储具有相同文件名的文件。由于文件修改时间和if - modified - since HTTP报头,您可以询问服务器是否值得再次下载图像。

    File f = new File();// the file to download
    HttpURLConnection con = (HttpURLConnection) new URL("http://www.test.com/"+f.getName()).openConnection();
    // Add the IfModifiedSince HEADER
    con.setIfModifiedSince(f.lastModified());
    con.setRequestMethod("GET");
    con.connect();
    if(con.getResponseCode() == 304) {
        System.out.println(f+ " : already downloaded");
    } else {
        // Download the content again and store the image again
    }

如果本地文件的修改时间自第一次下载以来一直保持不变,并且服务器支持IfModifiedSince头,则可以工作。

如果你不知道如何匹配文件名和URL,那么就没有明显的办法了。

您可以用快速HEAD请求做一些实验并提取一些相关信息,如:

    内容长度
  • last - modified
  • ETag

Content-Length + Last-Modified可以很好地匹配。

对于ETag,如果你知道http服务器如何构建ETag,你可以尝试在你这边(在你所有的本地文件上)构建它,并将其用作比较值。关于ETags的一些信息:

    http://bitworking.org/news/150/REST-Tip-Deep-etags-give-you-more-benefits
  • https://serverfault.com/questions/120538/etag-configuration-with-multiple-apache-servers-or-cdn-how-does-google-do-etag

不幸的是,ETag可以用仅对服务器可见的信息(inode号)构建,因此您不可能重新构建它。

再次下载你的文件肯定会更容易/更快。

如果你不下载文件,你就不能与其他文件进行比较。

否则,你可以将下载的内容存储在临时文件中:

File temp = new File(FileUtils.getTempDirectory(), "temp");
FileUtils.copyURLToFile(url, temp);

然后循环遍历现有文件并调用:

FileUtils.contentEquals(temp, existingFile)

最后,您可能想要保留或删除临时文件。

当然这不是很快。如果你有数千个文件,你可以将它们的哈希值保存在一个文件中,而不是使用FileUtils.contentEquals

相关内容

  • 没有找到相关文章

最新更新