최근에 모사이트에서 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 서울리전에서는 문제가 발생하지 않았습니다.