异常关键词:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
public static void main(String[] args) {
HttpURLConnection connection = null;
try {
String url2 = "http://www.***.com/4f913bb5927_3864.pdf";
URL url = new URL(url2);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3*1000);
//得到输入流
InputStream inputStream = conn.getInputStream();
//获取自己数组
byte[] getData = readInputStream(inputStream);
//文件保存位置
File saveDir = new File("K:\\home\\q\\");
if(!saveDir.exists()){
saveDir.mkdir();
String fileName = "123.pdf";
File file = new File(saveDir+File.separator+fileName);
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if(fos!=null){
fos.close();
if(inputStream!=null){
inputStream.close();
System.out.println("info:"+url+" download success");
} catch (Exception e) {
System.out.println(e);
}finally {
if (null != connection) {
connection.disconnect();
保存的文件打不开,通过byte数据可以看到301了。
<head><title>301 Moved Permanently</title></head>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
通过 conn.getHeaderFields() 发现url重定向到了 https请求,
进行重定向后的url获取:
String newUrl = "";
if(conn.getHeaderFields().keySet().contains("Location")){
newUrl = conn.getHeaderFields().get("Location").get(0);
url = new URL(newUrl);
HttpURLConnection conn2 = (HttpURLConnection)url.openConnection();
//设置超时间为3秒
conn2.setConnectTimeout(3*1000);
执行报错:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
解决SSL问题,修改为https,并忽略验证,否则会报错
url = new URL(newUrl);
HttpsURLConnection conn2 = (HttpsURLConnection)url.openConnection();
//设置超时间为3秒
conn2.setConnectTimeout(3*1000);
conn2.setHostnameVerifier(DO_NOT_VERIFY);
这时候,报证书问题了:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
最后解决:
* 从输入流中获取字节数组
* @param inputStream
* @return
* @throws IOException
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
bos.close();
return bos.toByteArray();
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
public static void main(String[] args) {
HttpURLConnection connection = null;
try {
String url2 = "http://wechaapi.xmskygzc.com/data/datafile/onlineService/signFile/2022/03/07/4be5418407e24209a0ac24f913bb5927_3864.pdf";
URL url = new URL(url2);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
String newUrl = "";
if(conn.getHeaderFields().keySet().contains("Location")){
newUrl = conn.getHeaderFields().get("Location").get(0);
url = new URL(newUrl);
HttpsURLConnection conn2 = (HttpsURLConnection)url.openConnection();
//设置超时间为3秒
conn2.setConnectTimeout(3*1000);
conn2.setHostnameVerifier(DO_NOT_VERIFY);
//得到输入流
InputStream inputStream = conn2.getInputStream();
//获取自己数组
byte[] getData = readInputStream(inputStream);
//文件保存位置
File saveDir = new File("K:\\home\\q\\");
if(!saveDir.exists()){
saveDir.mkdir();
String fileName = "123.pdf";
File file = new File(saveDir+File.separator+fileName);
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if(fos!=null){
fos.close();
if(inputStream!=null){
inputStream.close();
System.out.println("info:"+url+" download success");
} catch (Exception e) {
System.out.println(e);
}finally {
if (null != connection) {
connection.disconnect();
public static void main2(String[] args) {
HttpURLConnection connection = null;
try {
String url2 = "http://www.***.com/e5418407e29a0ac24f913bb5927_3864.pdf";
URL url = new URL(url2);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
String newUrl = "";
if(conn.getHeaderFields().keySet().contains("Location")){
newUrl = conn.getHeaderFields().get("Location").get(0);
url = new URL(newUrl);
ignoreSsl();
HttpsURLConnection conn2 = (HttpsURLConnection)url.openConnection();
//设置超时间为3秒
conn2.setConnectTimeout(3*1000);
conn2.setHostnameVerifier(DO_NOT_VERIFY);
//得到输入流
InputStream inputStream = conn2.getInputStream();
//获取自己数组
byte[] getData = readInputStream(inputStream);
//文件保存位置
File saveDir = new File("K:\\home\\q\\");
if(!saveDir.exists()){
saveDir.mkdir();
String fileName = "123.pdf";
File file = new File(saveDir+File.separator+fileName);
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if(fos!=null){
fos.close();
if(inputStream!=null){
inputStream.close();
System.out.println("info:"+url+" download success");
} catch (Exception e) {
System.out.println(e);
}finally {
if (null != connection) {
connection.disconnect();
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
static class miTM implements TrustManager,X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
* 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
* @throws Exception
public static void ignoreSsl() throws Exception{
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
异常关键词:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target下载代码public stat
支持文件夹上传,且要求在服务端保留层级结构。文件夹数量要求支持到10W。
支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传。文件大小要求能够支持到50个G。
支持自动加载本地文件,要求能够自动加载指定的本地文件。
支持文件批量下载,要求不要
参考:http://m.blog.csdn.net/blog/telenewbie/44815035
问题产生的原因是https网站的证书不是Android所信任的证书。解决方案之一是去android授权的证书发证机构申请正式证书。
另外一种就是修改客户端代码,强制通过所有证书为信任。这样做会有安全漏洞的问题。
HttpDownloader.java
最近发现在做https请求时,会报出SSL握手异常
javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate signature.
仔细看了下,用HttpUrlConne
清明假期前,我们需要执行一个批量操作,把腾讯云的视频下载下来,使用python脚本压缩并转码后上传到腾讯云另一个桶。写完代码后,跑起来观察了一会,一切正常。
然而回来后发现,线程卡住了,而且没有任何的日志输出,所以完全不知道问题出在哪里。重启容器后,代码继续正常跑,可是跑了几个小时后,再次出现。
代码如下:
public boolean downloadNet(String videoUrl, String filePath) throws...
可以使用 Java 中的 java.net.URL 类和 java.net.HttpURLConnection 类来实现文件下载功能。具体步骤如下:
1. 构造 URL 对象并设置需要下载文件的 URL 地址。
2. 打开 URL 连接并设置请求头信息,例如 User-Agent、Referer 等。
3. 获取响应码,如果响应码为 200 则代表可以下载文件。
4. 获取文件的输入流并创建文件的输出流,读取输入流中的数据并将其保存到输出流中。
5. 关闭输入输出流和 URL 连接。
以下是 Java 示例代码:
try {
// 1、构造 URL 对象
URL url = new URL("http://example.com/file.txt");
// 2、打开 URL 连接并设置请求头信息
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
conn.setRequestProperty("Referer", "http://example.com");
// 3、获取响应码
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
// 4、获取文件的输入流并创建文件的输出流
InputStream in = conn.getInputStream();
OutputStream out = new FileOutputStream("local-file.txt");
// 读取输入流中的数据并将其保存到输出流中
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
// 5、关闭输入输出流和 URL 连接
out.close();
in.close();
conn.disconnect();
System.out.println("文件下载成功");
} else {
System.out.println("文件下载失败,响应码:" + responseCode);
} catch (IOException e) {
System.out.println("文件下载异常:" + e.getMessage());
希望能帮到您!
ajax上传图片TypeError: 'append' called on an object that does not implement interface FormData.