文字标题:java通过url得到文件对象(支持http和https)

作者:锅巴

1.场景:通过一个url地址来得到一个文件,此方式就是通过一个url将文件下载到本地的临时文件,直接上代码

    /**
* 远程读取文件
*
* @param netUrl
* @return
*/
public static File getNetUrl(String netUrl) {
//判断http和https
File file = null;
if (netUrl.startsWith("https://")) {
file = getNetUrlHttps(netUrl);
} else {
file = getNetUrlHttp(netUrl);
}
return file;
}

全部引用的包,工具类可能有其他引用,取自己所需的路径就好

2.getNetUrlHttp方法

这里创建的是本地临时文件,所以用完了之后,不用刻意调用file.delete方法进行删除

import com.guoba.util.X509TrustUtiil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.net.ssl.*;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.channels.FileChannel;
import java.util.*; public static File getNetUrlHttp(String netUrl) {
//对本地文件命名
String fileName = StringUtils.reloadFile(netUrl);
File file = null; URL urlfile;
InputStream inStream = null;
OutputStream os = null;
try {
file = File.createTempFile("net_url", fileName);
//下载
urlfile = new URL(netUrl);
inStream = urlfile.openStream();
os = new FileOutputStream(file); int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
} catch (Exception e) {
log.error("远程图片获取错误:"+netUrl);
e.printStackTrace();
} finally {
try {
if (null != os) {
os.close();
}
if (null != inStream) {
inStream.close();
} } catch (Exception e) {
e.printStackTrace();
}
} return file;
}

getNetUrlHttps

这个方法就相对于要麻烦很多了,毕竟涉及到ssl,很多人再请求的时候绕不开ssl,这里可以通过代码进行处理

SSLContext不需要其他包,使用java自带的,无需import
/**
* 下载文件到本地(支持https)
*
* @param fileUrl 远程地址
* @throws Exception
*/
public static File getNetUrlHttps(String fileUrl) {
//对本地文件进行命名
String file_name = StringUtils.reloadFile(fileUrl);
File file = null; DataInputStream in = null;
DataOutputStream out = null;
try {
file = File.createTempFile("net_url", file_name); SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE");
sslcontext.init(null, new TrustManager[]{new X509TrustUtiil()}, new java.security.SecureRandom());
URL url = new URL(fileUrl);
HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslsession) {
logger.warn("WARNING: Hostname is not matched for cert.");
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
HttpsURLConnection urlCon = (HttpsURLConnection) url.openConnection();
urlCon.setConnectTimeout(6000);
urlCon.setReadTimeout(6000);
int code = urlCon.getResponseCode();
if (code != HttpURLConnection.HTTP_OK) {
throw new Exception("文件读取失败");
}
// 读文件流
in = new DataInputStream(urlCon.getInputStream());
out = new DataOutputStream(new FileOutputStream(file));
byte[] buffer = new byte[2048];
int count = 0;
while ((count = in.read(buffer)) > 0) {
out.write(buffer, 0, count);
}
out.close();
in.close();
} catch (Exception e) {
log.error("远程图片获取错误:"+fileUrl);
e.printStackTrace();
} finally {
try {
if (null != out) {
out.close();
}
if (null != in) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
} return file;
}

工具类X509TrustUtiil

import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; public class X509TrustUtiil implements X509TrustManager { @Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// TODO Auto-generated method stub } @Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// TODO Auto-generated method stub } @Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
} }

ps:最后放两个StringUtils工具类

/**
* 重命名,UUIU
*
* @param oleFileName
* @return
*/
public static String reloadFile(String oleFileName) {
oleFileName = getFileName(oleFileName);
if (StringUtils.isEmpty(oleFileName)) {
return oleFileName;
}
//得到后缀
if (oleFileName.indexOf(".") == -1) {
//对于没有后缀的文件,直接返回重命名
return UniqId.getUid();
}
String[] arr = oleFileName.split("\\.");
// 根据uuid重命名图片
String fileName = UniqId.getUid() + "." + arr[arr.length - 1]; return fileName;
} /**
* 把带路径的文件地址解析为真实文件名 /25h/upload/hc/1448089199416_06cc07bf-7606-4a81-9844-87d847f8740f.mp4 解析为 1448089199416_06cc07bf-7606-4a81-9844-87d847f8740f.mp4
*
* @param url
*/
public static String getFileName(final String url) {
if (StringUtils.isEmpty(url)) {
return url;
}
String newUrl = url;
newUrl = newUrl.split("[?]")[0];
String[] bb = newUrl.split("/");
String fileName = bb[bb.length - 1];
return fileName;
}

用好以上类【工具类】,就可以通过一个url将远程地址的文件转化为本地文件了(_)

java通过url得到文件对象(支持http和https)的更多相关文章

  1. java根据url获取json对象

    package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...

  2. java 创建一个File文件对象

    Example10_1.java import java.io.*; public class Example10_1 { public static void main(String args[]) ...

  3. node 后台ajax文件(同时支持http、https)

    var http = require("http"), Url = require("url"), querystring = require('queryst ...

  4. Java压缩和解压缩文件工具

    Java压缩和解压缩文件工具 学习了: https://www.oschina.net/code/snippet_1021818_48130 http://blog.csdn.net/gaowen_h ...

  5. Spring Boot系列教程十四:Spring boot同时支持HTTP和HTTPS

    自签证书 openssl生成服务端证书,不使用CA证书直接生成 -in server.csr -signkey server.key -out server.crt # 5.server证书转换成ke ...

  6. [原创]Java开发在线打开编辑保存Word文件(支持多浏览器)

    Java调用PageOffice实现在线编辑保存Word文件(以jsp调用为例,支持SSM.SSH.SpringMVC等流行框架) 1. 下载PageOffice开发包:http://www.zhuo ...

  7. java 27 - 2 反射之 反射的概述以及获取Class文件对象的方式

    反射: JAVA语言的反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调 ...

  8. Java 获取网络重定向文件的真实URL

    其实Java 使用HttpURLConnection下载的的时候,会自动下载重定向后的文件,但是我们无法获知目标文件的真实文件名,文件类型,用下面的方法可以得到真实的URL,下面是一个YOUKU视频的 ...

  9. edtftpj让Java上传FTP文件支持断点续传

    在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...

  10. Java笔记(二十七)……IO流中 File文件对象与Properties类

    File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...

随机推荐

  1. 在阿里云和腾讯云的轻量应用服务器上搭建Hadoop集群

    引入 本文在两台2核2g的云服务器上搭建了Hadoop集群,两台云服务器分别是阿里云(hjm)和腾讯云(gyt),集群部署规划如下: hjm gyt HDFS NameNode\SecondaryNa ...

  2. Solution -「洛谷 P4688」「YunoOI 2016」掉进兔子洞

    Description (Link)[https://www.luogu.com.cn/problem/P4688]. 每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的 ...

  3. vue2实现饼图Pie组件封装

    实现如下效果: 效果展示:https://code.juejin.cn/pen/7226656439941955644 如果不会请移步到官网的栗子,请点击查看 直接给大家上代码: 整体代码片段 1 & ...

  4. Macos下用Clion调试chromium源码

    1:下载CLion 2021.1.3(网上有破解版) 2:选择File->Open 导入chromium源码 3:在Src同级目录新建一个CMakeLists.txt 4:点击clion编译按钮 ...

  5. javascript继承的 6 种方法

    1. 原型链继承 2. 借用构造函数继承 3. 组合继承(原型+借用构造) 4. 原型式继承 5. 寄生式继承 6. 寄生组合式继承

  6. P1844 阅览室

    此题现有题解较为冗长,因此前来贡献一发最短解. 首先正常的思路是直接按题意模拟.即: 枚举当前时刻 \(T\) 对于每个人,标记该时刻想要拿到的书 根据题目的要求判断冲突情况 对书进行分配 实现起来复 ...

  7. Codeforces Round 823 (Div. 2)C

    C. Minimum Notation 思路:我们可以进行的操作时将一个位置的数删除然后在任意位置处添加一个比当前数大1并且小于9的数,所以我们的操作只会让一个数变大,我们统计一个最大值的后缀,贪心的 ...

  8. 关于虚拟机的IP地址经常改变问题的解法

    主要解法就是配置静态IP地址 首先了解一下IP和子网掩码,网关的含义:IP 是标识计算机特定地址的二进制数,子网掩码用于和IP组合划分子网;网关是将信息传送到网关进行收发 开始配置:首先打开Linux ...

  9. 聊聊Transform模型

    摘自<BERT基础教程:Transformer大模型实战 > 概述 循环神经网络和长短期记忆网络已经广泛应用于时序任务,比如文本预测.机器翻译.文章生成等.然而,它们面临的一大问题就是如何 ...

  10. 怎样给边框添加阴影?CSS3属性box-shadow帮你搞定!

    作者:WangMin 格言:努力做好自己喜欢的每一件事 关于box-shadow属性,有的小伙伴可能用的时候直接复制已有的,并没有仔细了解过box-shadow属性的参数分别是什么含义,最后导致阴影的 ...