网络资源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($ ...
随机推荐
- Exchange Server 2010安装
Exchange Server 2010安装 Exchange Server 2010是Microsoft最新的邮件服务器软件,功能比较强大.在此,我们在虚拟机中安装体验一下,主要步骤如下: (1) ...
- SQL ----- JDBC 用ID查询某条记录
package demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...
- 配置nginx直接使用webpack生成的gz压缩文件,而不用nginx自己压缩
参考链接:https://blog.csdn.net/ywl570717586/article/details/100011721
- git 命令 查看历史提交 git log
怎么理解git commit 命令 git commit 相当于 我们虚拟机快照操作,每次执行commit命令 相当于对本地仓库做一次快照,保存了当时仓库的状态, git commit -m 加上的& ...
- ByteArrayInputStream类
一.说明 哈哈,这是学习Java之路的第一篇博文.虽然说接触学习Java有一段时间了,但是对流的概念一直并不是很清楚.也看了很多资料,但是感觉还是非常的抽象很难去理解.但是流又是Java中很重要的一部 ...
- Linux系列(11):之bash进阶与数据流导向、管线命令
1.万用字符与特殊字符 在bash的环境下有一个特别有用的功能,那就是万用字符!下面展示常见的万用字符: 1.万用字符 除了万用字符还有一些其他的特殊字符,接下来显示特殊字符. 2.特殊字符 2.数据 ...
- BOF和EOF详解2
在学生信息管理系统中有多处用到EOF和BOF,使用BOF和EOF属性可确定Recordset对象是否包含记录,或者从一个记录移动到另一个记录是否超出Recordset对象的限制. BOF和EOF他们是 ...
- Centos yum 安装 rabbitmq-server
安装rabbitmq-server yum install -y rabbitmq-server 开启后台管理 rabbitmq-plugins enable rabbitmq_managemen ...
- Neo4j Cypher语法(二)
目录 4 子句 4.1 CREATE 4.2 MATCH 4.3 Match 4.4 Create match return连用来返回一个关系基础 4.5 Optional_match 4.6 Wit ...
- Java 反射理解(三)-- Java获取方法信息
Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...