如何使用java下载保存元数据的文件?

时间:2013-08-13 01:56:38

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

通过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!");
    }

2 个答案:

答案 0 :(得分:0)

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

选项:

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

  • 如果您可以使用wgetcurl或同等身份,则他们应该能够保留时间戳。

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

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

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

答案 1 :(得分:0)

检查这个对Download the File in Java 11 using HttpClient的回答

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