网络资源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($ ...
随机推荐
- springboot整合es客户端操作elasticsearch(二)
在上章节中整合elasticsearch客户端出现版本问题进行了处理,这章来进行springboot整合得操作 环境:elaticsearch6.2.1,springboot 2.1.8 客户端版本采 ...
- Spring源码分析(1)容器的基本实现——核心类介绍
bean是Spring中最核心的东西,因为Spring就像是个大水桶,而bean就像是容器中的水,水桶脱离了水便也没什么用处了,那么我们先看看bean的定义. public class MyTestB ...
- SpringMVC 零配置 无web.xml
对SpringMVC启动流程的讲解 https://www.cnblogs.com/beiyan/p/5942741.html 与SpringMVC的整合 https://hanqunfeng.ite ...
- zping ping包工具20180605.exe测试版
链接: https://pan.baidu.com/s/1WB3BZn0r9n4DRU_8bNC65g 提取码: mybi zping的第一个exe版本由于未对兼容性进行测试,使用python3.6编 ...
- 数据排序 sort
排序命令: 常和管道进行协作的命令 -sort (默认使用字符的第一个字符进行排序) -n 按数字排序 -r 反序排序 -o 结果 输出到文件 -t 分隔符 (sort -n -t &qu ...
- HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并)
layout: post title: HDU-6704 K-th occurrence (后缀自动机father树上倍增建权值线段树合并) author: "luowentaoaa&quo ...
- 前缀和&二维前缀和
我们知道,数组上的前缀和S[i]=S[i-1]+a[i] 那么,怎样求二维前缀和呢? 二维前缀和: 绿色点的前缀和就是黄色.红色.灰色和绿色的点权和 怎样计算? s[i][j]=s[i-1][j]+s ...
- peewee无外键连接
# 参考:https://blog.csdn.net/weixin_34273479/article/details/87587183 res = Name.select(Name, User.xxx ...
- tensorflow零起点快速入门(1)
导入: 其中的TF_CPP_MIN_LOG_LEVEL据说是为了忽略警告,但是我这里没有意义(numpy的一些警告) import tensorflow as tf import os os.envi ...
- 关于CPU的一些操作(CPU设置超频)
常见的几种CPU模式: .ondemand:系统默认的超频模式,按需调节,内核提供的功能,不是很强大,但有效实现了动态频率调节,平时以低速方式运行,当系统负载提高时候自动提高频率.以这种模式运行不会因 ...