网络资源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($ ...
随机推荐
- xss 学习(一)
存储型 .反射型.DOM 型这是最常见的三种分类: 存储型存储型XSS也叫持久型XSS,存储的意思就是Payload是有经过存储的,当一个页面存在存储型XSS的时候,XSS注入成功后,那么每次访问该页 ...
- 【计算机视觉】UCLA开源图像检测器
UCLA (加州大学洛杉矶分校)发布了一个强大的图像检测软件的源码 ,该软件可以非常高速的检测每个图像的细节,例如可用于检测指纹和虹膜,或者用于自动驾驶.通过识别物体的边界进行提取.首先确定一个物体的 ...
- django中的Form和ModelForm中的问题
django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新 方法一:重写构造方法,在构造方法中重新去获取值 class UserForm(forms.Form): ...
- (5.14)mysql高可用系列——级联复制与多主一从
目录: [0]实验需求 级联复制,201为主库,202为从库/同时为203的主库,203为202的从库[1]实验环境 级联:A->B->C 实践思路: (1)直接拿A的xtrabackup ...
- [转帖]Xenix — 微软与UNIX的短暂爱恋
Xenix — 微软与UNIX的短暂爱恋 https://www.linuxdashen.com/xenix-微软与unix的短暂爱恋 原来微软曾经 干过那么牛B的 unix系统. 微软向外宣布Mic ...
- JAVA汽车4S店管理系统
JAVA汽车4S店管理系统源码(前台+后台)分为这5个大模块 系统设置 整车销售辅助销售汽修管理 汽修统计1.经理管理(增加 和删除功能) 表设计经理编号经理名年龄性别2.业务员管理(增删改查) ...
- 基于Springboot后台,前台 vue.js 跨域 Activiti6 工作流(用到websocket技术) 的项目
工作流模块----------------------------------------------------------------------------------------------- ...
- django 路由层 伪静态网页 虚拟环境 视图层
路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页 虚拟环境 视图层 JsonResponse FBV与CBV 文件上传 项目urls.py下面 from app01 import ...
- pg_ctl — 启动、停止、重启 PostgreSQL
pg_ctl 名称 pg_ctl -- 启动.停止.重启 PostgreSQL 语法 pg_ctl start [-w] [-s] [-D datadir] [-l filename] [-o opt ...
- UEFI笔记 --- PeiReadOnlyVariable2->GetVariable()
问:在PEI阶段,PeiReadOnlyVariable2->GetVariable()可以从Pei Hob或NV RAM中获取UEFI变量,例如Setup默认值.若平台首次烧录BIOS并开机, ...