package com.yrk.utils;
import java.io.DataInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
/**
* 只需要依赖于tomcat环境即可
*
*/
public class FileDownload {
/**
*
* @param fileUrl:远程下载地址
* @param response
* @param fileName:文件名,下载后的文件名
* @throws Exception
*/
public static void downloadFile(String fileUrl,
HttpServletResponse response, String fileName) throws Exception {
TrustManager[] tm = { new TrustAnyTrustManager() };
SSLContext sc = SSLContext.getInstance("SSL", "SunJSSE");
sc.init(null, tm, new java.security.SecureRandom());
URL url = new URL(fileUrl);
HttpsURLConnection urlCon = (HttpsURLConnection) url.openConnection();
urlCon.setConnectTimeout(6000);
urlCon.setReadTimeout(6000);
urlCon.setSSLSocketFactory(sc.getSocketFactory());
urlCon.setHostnameVerifier(new TrustAnyHostnameVerifier());
urlCon.setDoOutput(true);
urlCon.setDoInput(true);
urlCon.setRequestMethod("GET");
urlCon.connect();
int code = urlCon.getResponseCode();
if (code != HttpURLConnection.HTTP_OK) {
throw new Exception("文件读取失败");
}
// 读文件流
DataInputStream in = new DataInputStream(urlCon.getInputStream());
response.setContentType("application/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename="
+ URLEncoder.encode(fileName, "utf-8"));
ServletOutputStream out = response.getOutputStream();
byte[] buffer = new byte[2048];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
out.flush();
in.close();
}
private static class NullHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
private static class TrustAnyTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[] {};
}
}
private static class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}