网络资源url转化为file对象下载文件
注:只测试过网络图片资源。
一、使用org.apache.commons.io.FileUtils
二、
三、httpURLConnection.disconnect();
四、
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils; import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID; /**
* URLConnection的连接、超时、关闭用法总结 : https://www.cnblogs.com/achengmu/p/10057243.html
* RandomAccessFile简介与使用 : https://blog.csdn.net/qq_31615049/article/details/88562892
*/
public class Test { private static String dirPath = "F:\\\\upload2222";
public static void main(String[] args) throws IOException { String url = "http://imgsrc.baidu.com/forum/pic/item/a701a18b87d6277fff058e4125381f30e924fcb0.jpg";
//方式1
// copyByUrl(url, rewriteFileName(url), dirPath);
//方式2
// urlOpenStreamWrite(url, "antStorm_100171553219414047v.jpg", dirPath);
//方式3
// downLoadByUrl(url, "antStorm_100171553219414047m3v.jpg", dirPath);
//方式4
randomAccessWrite(url);
} /**
* import org.apache.commons.io.FileUtils;
*/
public static void copyByUrl(String urlStr,String fileName,String savePath)throws IOException {
URL url = new URL(urlStr);
FileUtils.copyURLToFile(url, new File(savePath+ File.separator+fileName));
} /**
* urlOpenStreamWrite file
*/
public static void urlOpenStreamWrite(String urlStr,String fileName,String savePath) throws IOException {
URL url =new URL(urlStr);
InputStream is = url.openStream();
// int available = is.available();
// System.out.println(available); File file = new File(savePath + File.separatorChar + fileName);
//不存在,创建必要的(多层)目录
File parentDir = file.getParentFile();
if(!parentDir.exists())
parentDir.mkdirs(); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[2048];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
} if(fos!=null) fos.close();
if(is!=null) is.close();
} /**
* (HttpURLConnection)url.openConnection()
* httpURLConnection.getInputStream()
*/
public static void downLoadByUrl(String urlStr,String fileName,String savePath)throws IOException{ URL url =new URL(urlStr); /**
* 此处的urlConnection对象实际上是根据URL的
* 请求协议(此处是http)生成的URLConnection类
* 的子类HttpURLConnection,故此处最好将其转化
* 为HttpURLConnection类型的对象,以便用到
* HttpURLConnection更多的API.
*/
HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置超时间为3秒
// conn.setConnectTimeout(5*1000);
//防止屏蔽程序抓取而返回403错误
// conn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream is = conn.getInputStream();
//偷看有效长度
// int available = is.available(); //文件保存位置
File saveDir =new File(savePath);
if(!saveDir.exists()) saveDir.mkdirs(); File file =new File(saveDir + File.separator + fileName);
FileOutputStream fos =new FileOutputStream(file);
//获取缓存内容的byte数组,可以转化成其他流
byte[] cachedBytes =readInputStream(is);
fos.write(cachedBytes); if(fos!=null) fos.close();
if(is!=null) is.close(); System.out.println("info:"+url+" download success");
//断开
conn.disconnect();
//删除文件
// file.delete();
} /**
* 获取缓存内容的byte数组,可以转化成其他流
*/
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(); } /**
* rewriteFileName重命名,UUIU
*/
public static String rewriteFileName(String oleFileName) {
oleFileName = getOriginalFileName(oleFileName);
if (StringUtils.isEmpty(oleFileName)) {
return oleFileName;
}
//得到后缀
if (oleFileName.indexOf(".") == -1) {
//对于没有后缀的文件,直接返回重命名
return UUID.randomUUID().toString();
}
String[] arr = oleFileName.split("\\.");
// 根据uuid重命名图片
String fileName = UUID.randomUUID().toString() + "." + 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 getOriginalFileName(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;
} /**
* RandomAccessFile 读写文件
* https://blog.csdn.net/qq_31615049/article/details/88562892
*/
private static void writeFile(InputStream is, File storeFile){ RandomAccessFile raf = null;
int buffer_len = 1024;
byte[] buffer = new byte[buffer_len];
int readLen = 0; try{
raf = new RandomAccessFile(storeFile, "rw");
raf.seek(raf.length());//设置光标位置。从此处开始写(插)入文件内容。
while(-1 != (readLen = is.read(buffer, 0, buffer_len))){
raf.write(buffer, 0, readLen);
} } catch (Exception e){
e.printStackTrace();
} finally { try {
if(raf != null)
raf.close();
if(is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
*
* @param funnyUrl
* @throws IOException
*/
public static void randomAccessWrite(String funnyUrl) throws IOException {
// String newFIleName = rewriteFileName(funnyUrl).replace("-", "");
//创建tempfile取用后缀就够了
String newFIleName = getOriginalFileName(funnyUrl); String suffix = newFIleName.substring(newFIleName.lastIndexOf("."));
//指定路径,否则存储在默认路径中
File tempFile = File.createTempFile("url_dwn", suffix, new File(dirPath));
//File tempFile = File.createTempFile("url_dwn", suffix);
URL url = new URL(funnyUrl);
InputStream is = url.openStream();
writeFile(is, tempFile);
} }
java通过url得到文件对象(支持http和https):
https://blog.csdn.net/qq_21235239/article/details/99415421
五、trash
/**
* 后台验证:以后缀名称检查图片格式
* @param files
* @return 不容许的文件名称,以“ , ”隔开
*/
public static String checkFileType(MultipartFile[] files) { StringBuilder rejectFileNames = new StringBuilder(); for (MultipartFile file : files) {
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
//枚举中可以上传的文件类型
List<String> fileTypes = FileType.getFileTypes();
//可以上传的文件类型检查
if(!fileTypes.contains(suffix)) {
rejectFileNames.append(originalFilename).append(" , ");
}
} if(rejectFileNames.length() > 0) {
int idx = rejectFileNames.lastIndexOf(",");
//删除末尾的自定义分隔符
rejectFileNames.delete(idx - 1, rejectFileNames.length());
} return rejectFileNames.toString();
} /**
* 图片格式后缀名称枚举
*/
enum FileType {
PEG("peg"),
JPG("jpg"),
BMP("bmp"),
PNG("png"); private String type; FileType(String type) {
this.type = type;
} public String getType() {
return type;
} public static List<String> getFileTypes() {
FileType[] fileTypes = FileType.values();
List<String> types = Arrays.stream(fileTypes).map(FileType::getType).collect(Collectors.toList());
return types;
}
}
网络资源url转化为file对象下载文件的更多相关文章
- java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例
什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...
- 通过指定的 url 去网络或者文件服务器下载文件到本地某个文件夹
/** * 从网络Url中下载文件 * @param urlStr 指定的url * @param fileName 下载文件到本地的名字 * @param savePath 本地保存下载文件的路径 ...
- 前后台交互实现点击超链接通过指定的 url 去网络或者文件服务器下载文件
前台 VUE 界面: <el-table-column prop="attachment" align="center" label="附件详情 ...
- [javaSE] IO流(FIle对象递归文件列表)
获取File对象,new出来,构造参数:String目录名 调用File对象的list()方法,获取String[]数组文件名称 循环数组,列出所有文件包含隐藏文件 递归列出所有的数据 定义一个静态方 ...
- Windows下Java File对象创建文件夹时的一个"坑"
import java.io.File; import java.io.IOException; public class DirCreate { public static void main(St ...
- c#通过URL地址从服务器上下载文件
- 本地缓存下载文件,download的二次封装
来源:http://ask.dcloud.net.cn/article/524 源码下载链接 说明: (1)由于平时项目中大量用到了附件下载等功能,所以就花了一个时间,把plus的downlaod进行 ...
- Android OkHttp + Retrofit 下载文件与进度监听
本文链接 下载文件是一个比较常见的需求.给定一个url,我们可以使用URLConnection下载文件. 使用OkHttp也可以通过流来下载文件. 给OkHttp中添加拦截器,即可实现下载进度的监听功 ...
- php curl下载文件由于空格导致下载文件失败
<?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($ ...
随机推荐
- 分类并查集[noi2001 食物链]
题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=pxNJzxVPU 题目有三种动物,A吃B,B吃C,C吃A 即B是A的食物,A是B的天敌, ...
- 深入理解C语言-函数指针
函数指针在C++中有着重要的应用,函数的函数名其本质就是代表一个地址,这个地址叫做函数入口,得到这个地址就可以对这个函数进行各种操作. 函数类型基础 函数三要素: 名称.参数.返回值 C语言中的函数有 ...
- layui checkbox , radio 清除所有选中项
方法: $(selector).prop('cjecked', false); form.render(); 使用示例: // 清除radio选中 $('input[name=ymd]').prop( ...
- python3.7环境下创建app、运行Django1.11版本项目报错Generator expression must be parenthesized
有些同学喜欢追求新鲜感~但追求新鲜感终归是要付出一点点代价的 在编程领域有一句至理名言:用东西不要用最新的! 就像每次苹果系统的升级都会有相当一部分用户的手机成砖一样 下面我们就介绍一个因版本升级带来 ...
- Vue常见问题集中
a.VScode保持vue语法高亮的方式: 1.安装插件:vetur.打开VScode,Ctrl + P 然后输入 ext install vetur 然后回车点安装即可. 2.在 VSCode中使用 ...
- 12.Flume的安装
先把flume包上传并解压 给flume创建一个软链接 给flume配置环境变量 #flume export FLUME_HOME=/opt/modules/flume export PATH=$PA ...
- Python【无引号、单引号、双引号、三引号】
无引号#数字和数学运算是标准化.有固定格式的>>> print(520) 520>>> print(1+1)2 单引号#文字却能够千变万化>>> ...
- 深入15个HTML元素方法,你见过吗?
虽然现代化的 web 开发更多地依赖各种 MVC 框架,但开发者仍需要熟练掌握 HTML 与 DOM 方面的基础知识.不过,即使是有着多年经验的前端开发者,也会遇到一些不明所以的情况.本文首先将为初学 ...
- Python 最常见的 170 道面试题解析:2019 最新
Python 最常见的 170 道面试题解析:2019 最新 2019年06月03日 23:30:10 GitChat的博客 阅读数 21329 文章标签: PythonPython入门Python面 ...
- java——HashSet中add()方法不能加重复值得原因理解(我们一起来看底层代码吧)
Set<String> names = new HashSet<>(); names.add("张三"); names.add(new String(&qu ...