Как использовать Java для загрузки файла с сохранением метаданных?
Какой самый простой способ Java загрузить файл через HTTPS, сохранив метки времени и используя расположение содержимого для имени файла? Есть ли библиотека Java на более высоком уровне, чем apache-httpclient?
В настоящее время у меня есть:
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 ответа
Ни протокол HTTP, ни спецификации составного типа содержимого не обеспечивают никакого способа кодирования произвольных метаданных исходного файла. Спецификация HTTP определяет заголовок Last-Modified, который может быть установлен сервером, но это не требуется для этого. Но что более важно, типичные браузеры не сохраняют эту метку времени. (Некоторые инструменты командной строки делают... но это другой вопрос.) Заголовок Content-Disposition не является частью спецификации HTTP 1.1, но многие серверы поддерживают его в любом случае.
Опции:
Если вы используете библиотеку Java для выполнения выборки, тогда вы сможете получить "измененную" метку времени и расположение содержимого из заголовков Response. Обратитесь к соответствующей учебной информации по клиентской библиотеке.
Если вы можете использовать
wget
или жеcurl
или эквивалент, они должны быть в состоянии сохранить метку времени.Вы можете установить (надежный) плагин, который будет сохранять временные метки; например, этот для Firefox: https://addons.mozilla.org/en-us/firefox/addon/preserve-download-modification/. Тем не менее, я думаю, что вы вряд ли сможете сделать это в ненадежном Javascript... по соображениям безопасности.
Вы можете изменить сервер, чтобы упаковать файл в архивном формате, который может представлять метаданные, которые вы хотите включить, и загрузить файл в виде архива. Затем используйте соответствующую команду извлечения архива, чтобы извлечь файл. Это позволит вам передавать другие метаданные, такие как первоначальный владелец, данные контроля доступа и так далее.
В качестве альтернативы вы можете использовать команды Linux / Unix "scp" или "rsync" для передачи файлов.
Отметьте этот ответ, чтобы загрузить файл на Java 11 с помощью HttpClient
Метаданные, сохраненные в этом ответе, - это имя файла, поскольку имя файла получается из
Content-Disposition
заголовок ответа.