개발환경

java로 바이너리 파일 안정적으로 다운로드 받기

toogari 2019. 10. 11. 14:28

최근에 모사이트에서 pdf 파일을 다운로드 받아야 할 업무가 있었습니다.

 

가장 쉬운 방법은

org.apache.commons.io.FileUtils.copyURLToFile 을 이용하는 것입니다.

그런데 살펴보니 몇몇 pdf 파일은 다운은 받았지만 pdfview로 볼 수가 없었습니다. 다운받다가 중간에 끊긴 듯 싶습니다.

 

제가 자주 사용하는 방법은

httpcomponents-client-4.5.x 의 HttpClient 를 사용하는 것인데... 이것도 위의 방법보다 안정적이지만 몇몇 파일들에 문제가 있었습니다.

 

최종적으로 OkHttp 를 사용하여 가장 안정적으로 바이너리 파일을 다운받을 수 있었습니다.

 

 

public static void downloadOkHttp(String url, File dstFile,Server server) throws IOException {
        OkHttpClient client = null;
        if (server == null) {
            client = new OkHttpClient();
        } else {
            Proxy proxy = new Proxy(Proxy.Type.SOCKS,
                    new InetSocketAddress(server.getHost(), server.getPort()));
            OkHttpClient.Builder builder = new OkHttpClient.Builder().proxy(proxy);
            client = builder.build();
        }


        Request request = new Request.Builder()
                .url(url)
                .build();

        try (Response response = client.newCall(request).execute()) {
            org.apache.commons.io.FileUtils.copyInputStreamToFile(response.body().byteStream(), dstFile);
        }finally {

        }
    }

 

ps. 북미 GCP에서 국내사이트 크롤링할 때 발생한 문제로 gcp 서울리전에서는 문제가 발생하지 않았습니다.