#java #spring #spring-boot
Вопрос:
У меня есть 2 файла, которые размещены на внешнем сервере. Я хочу написать контроллер rest, который может архивировать все эти файлы вместе и загружать их (без загрузки в память, так как файлы могут быть большого размера).
Прямо сейчас я знаю, как это сделать, если эти файлы присутствуют в моем локальном. Но я не знаю, как это сделать с учетом вышеуказанных требований.
Ответ №1:
Вы можете использовать OkHttpClient и читать тело как поток. Как только у вас будут все File
буквы s в локальном, вы сможете застегнуть его, как обычно
public static File downloadResource(String fileName, String url, String downloadFilePath) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
OkHttpClient client = builder.readTimeout(600, TimeUnit.SECONDS).writeTimeout(600, TimeUnit.SECONDS)
.connectTimeout(600, TimeUnit.SECONDS).build();
Request downloadRequest = new Request.Builder().url(url).addHeader("cache-control", "no-cache")
.addHeader("Authorization", "add any authorization").build();
Response downloadResponse = null;
try {
downloadResponse = client.newCall(downloadRequest).execute();
if (downloadResponse.code() == HttpStatus.NOT_FOUND.value()) {
throw new RuntimeException("Unable to find the file -" fileName);
}
if (!downloadResponse.isSuccessful()) {
throw new RuntimeException("Unable to find the file -" fileName);
}
File downloadedFile = new File(downloadFilePath);
try (InputStream in = downloadResponse.body().byteStream();
FileOutputStream fos = new FileOutputStream("finalZip.zip");
BufferedOutputStream bos = new BufferedOutputStream(fos);
ZipOutputStream zos = new ZipOutputStream(bos);) {
// not available on BufferedOutputStream
zos.putNextEntry(new ZipEntry(fileName));
IOUtils.copyLarge(in, zos);
}
return downloadedFile;
} catch (ResourceAccessException hostException) {
throw new RuntimeException("Unable to connect with Server");
} catch (HttpClientErrorException | IOException e) {
throw new RuntimeException("Unable to connect with Server", e);
} finally {
if (downloadResponse != null amp;amp; downloadResponse.body() != null) {
downloadResponse.body().close();
}
}
}