通过HTTPS下载文件、保留时间戳并使用文件名的内容处理的最简单的java方法是什么?有没有比apachehttpclient更高级别的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!");
}
HTTP协议或多部分内容类型规范都不提供任何编码任意源文件元数据的方式。HTTP规范定义了一个可以由服务器设置的Last-Modified标头,但不需要这样做。但更重要的是,典型的浏览器不会保留这个时间戳。(有些命令行工具会这样做……但那是另一回事。)Content-Disposition标头不是HTTP1.1规范的一部分,但很多服务器都支持它。
选项:
-
如果您使用Java库进行获取,那么您应该能够从响应标头中获取"修改"的时间戳和内容处置。请参阅相关客户端库的教程信息。
-
如果您可以使用
wget
或curl
或等效程序,则它们应该能够保留时间戳。 -
您可以安装一个(受信任的)插件,该插件将保留时间戳;例如,这个适用于Firefox:https://addons.mozilla.org/en-us/firefox/addon/preserve-download-modification/.然而,我认为你不太可能在不受信任的Javascript中做到这一点。。。出于安全原因。
-
您可以更改服务器,将文件打包为可以表示要包含的元数据的存档格式,然后将文件作为存档下载。然后使用相关的归档提取器命令提取文件。这将允许您传输其他元数据,如原始所有者、访问控制详细信息等
或者,您可以使用Linux/Unix的"scp"或"rsync"命令来进行文件传输。
检查此答案以使用HttpClient 下载Java 11中的文件
由于文件名是从Content-Disposition
响应标头中获得的,因此此答案中保留的元数据是。