Zip и загрузка файлов с внешнего URL-адреса в весенней загрузке

#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();
          }
      }
  }