网络资源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($ ...
随机推荐
- 实习第一个月总结(const关键字、条件编译、volatile关键字、#和##的作用、函数指针)
C语言中const关键字的作用: 修饰局部变量或者全局变量,表示变量n的值不能被改变了 修饰指针,分为常量指针与指针常量,也可以两者结合 常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变, ...
- Centos7 安装python3.8和pip
安装python3 yum -y install yum-utilsyum-builddep pythoncurl -O https://www.python.org/ftp/python/3.8.0 ...
- 【转帖】Istio是啥?一文带你彻底了解!
Istio是啥?一文带你彻底了解! http://www.sohu.com/a/270131876_463994 原始位置来源: https://cizixs.com 如果你比较关注新兴技术的话,那么 ...
- nginx 报错:[crit] 12456#0: *5 SSL_do_handshake() failed (SSL: error:1408A0A0:SSL routines:SSL3_GET_CLIENT_HELLO
解决方法: 将配置 listen ssl; 更换为: listen ; ssl on; 从版本1.15.0开始,ssl on; 指令被废弃,使用 listen 443 ssl; 代替. 具体查看官网: ...
- Java基础题记录
1. 装箱和拆箱 装箱:自动将基本数据类型转换为包装器类型即引用数据类型 拆箱:将包装器类型转换为基本数据类型 2. Java的8中基本数据类型 关键字 字节数 范围 默认值 boolelan 1by ...
- Django项目中添加富文本编辑器django-ckeditor
django-ckeditor库的使用步骤: 1.在命令行下安装django-ckeditor这个库: 命令:pip install django-ckeditor 2.安装成功后,配置Django项 ...
- Bean属性复制,字段名可不同,字段类型不同需要自行处理
@Setter @Getter public class SourceA { private String name; private String text; public SourceA(Stri ...
- Linux更改ext4根目录文件系统大小
首先通过lsblk 查看一下文件系统情况 然后通过fdisk /dev/sda类似命令,打开对应的磁盘管理,然后: 删除所有磁盘分区 重新建立一个更大的分区. 保存退出 再次通过lsblk查看分区大小 ...
- sequelize学习笔记
示例: const Sequelize = require('sequelize'); // 建立连接 const sequelize = new Sequelize('test', 'root', ...
- STM32F10xxx_Keil中添加的预定义宏
目录 STM32F10xxx_Keil中添加的预定义宏 更新记录 STM32F10xxx_Keil中添加的预定义宏 更新记录 version status description date autho ...