【问题标题】:How to use java to download a file preserving metadata?如何使用java下载保存元数据的文件?
【发布时间】:2013-08-14 12:02:51
【问题描述】:

通过 HTTPS 下载文件、保留时间戳并使用文件名的内容处置的最简单的 java 方法是什么?有没有比apache-httpclient级别更高的java库?

目前我有:

    HttpClient httpClient = new DefaultHttpClient();
    HttpResponse httpResponse = httpClient.execute(new HttpGet(parser.sourceUrl));
    Header cd = httpResponse.getLastHeader("Content-Disposition");
    String filename = cd.getValue().split(";")[1].split("=")[1]; // TODO(jayen): unhack
    HttpEntity httpEntity = httpResponse.getEntity();
    System.out.println("Saving " + filename);
    httpEntity.writeTo(new FileOutputStream(folder.getCanonicalPath() + File.separator + filename));
    if (httpResponse.containsHeader("Last-Modified")) {
        System.err.println("Please implement timestamping");
    } else {
        System.out.println("No timestamp available!");
    }

【问题讨论】:

标签: java apache-httpclient-4.x last-modified content-disposition


【解决方案1】:

HTTP 协议或多部分内容类型规范都没有提供任何编码任意源文件元数据的方式。 HTTP 规范定义了一个可以由服务器设置的 Last-Modified 标头,但这不是必需的。但更重要的是,典型的浏览器不会保留这个时间戳。 (一些命令行工具可以......但那是另一回事。) Content-Disposition 标头不是 HTTP 1.1 规范的一部分,但很多服务器无论如何都支持它。

选项:

  • 如果您使用 Java 库进行提取,那么您应该能够从响应标头中获取“修改后的”时间戳和内容配置。请参阅相关客户端库的教程信息。

  • 如果您可以使用wgetcurl 或等效项,它们应该能够保留时间戳。

  • 您可以安装一个(受信任的)插件来保存时间戳;例如这个是 Firefox 的:https://addons.mozilla.org/en-us/firefox/addon/preserve-download-modification/。但是,我认为出于安全原因,您不太可能在不受信任的 Javascript 中执行此操作。

  • 您可以更改服务器以将文件打包成可以代表您想要包含的元数据的存档格式,然后将文件下载为存档。然后使用相关的归档提取器命令来提取文件。这将允许您传输其他元数据,例如原始所有者、访问控制详细信息等。

或者,您可以使用 Linux / Unix 的“scp”或“rsync”命令进行文件传输。

【讨论】:

  • 我目前正在做你的第一个选择。我正在编写一个 java 程序,并且不想启动 shell 命令。
【解决方案2】:

查看Download the File in Java 11 using HttpClient的这个答案

此答案中保留的元数据是 filename,因为 filename 是从 Content-Disposition 响应标头中获取的。

【讨论】:

猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 2022-12-18
相关资源
最近更新 更多