1.如果是本地,直接就
String filePath ="D:b.pdf";//本地path
File file = new File(filePath);
然后获取就ok。
2.如果是url,可以采取先下载,暂时存起来,用完再删除掉就ok。
可参考以下代码:
package com.ece.manager.web.util.contract;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.Base64.Encoder;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.lf5.util.StreamUtils;
/**
* @description 文件工具类
* @author 小小舍
* @date 2019年9月3日
*/
public class FileHelper {
// ------------------------------公有方法start--------------------------------------------
public static void main(String[] args) throws Exception {
String urlPath ="http://192.168.10.105:8088/static/contract/1567517223487.pdf";
File excelFile = File.createTempFile("temp-", ".pdf");
String filePath = excelFile.getPath();
downloadFile(urlPath,filePath);//先下载
//String filePath ="D:b.pdf";//本地path
File file = new File(filePath);
System.out.println("文件大小"+getFileLength(filePath));
System.out.println("文件name"+getFileName(filePath));
System.out.println("获取文件MIME类型"+getContentType(filePath));
System.out.println("获取文件字节流"+getBytes(file));
System.out.println("计算文件contentMd5值:"+getContentMD5(filePath));
file.delete();
}
/**
* @description 下载url文件
* @param urlPath 文件的url路径
* @param downloadDir 下载地址
* @return
*/
public static File downloadFile(String urlPath, String downloadDir) {
File file = null;
try {
// 统一资源
URL url = new URL(urlPath);
// 连接类的父类,抽象类
URLConnection urlConnection = url.openConnection();
// http的连接类
HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
//设置超时
httpURLConnection.setConnectTimeout(1000*5);
//设置请求方式,默认是GET
httpURLConnection.setRequestMethod("POST");
// 设置字符编码
httpURLConnection.setRequestProperty("Charset", "UTF-8");
// 打开到此 URL引用的资源的通信链接(如果尚未建立这样的连接)。
httpURLConnection.connect();
// 文件大小
int fileLength = httpURLConnection.getContentLength();
// 控制台打印文件大小
System.out.println("您要下载的文件大小为:" + fileLength / (1024 * 1024) + "MB");
// 建立链接从请求中获取数据
URLConnection con = url.openConnection();
BufferedInputStream bin = new BufferedInputStream(httpURLConnection.getInputStream());
// 指定存放位置(有需求可以自定义)
String path = downloadDir + File.separatorChar ;
file = new File(path);
// 校验文件夹目录是否存在,不存在就创建一个目录
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
OutputStream out = new FileOutputStream(file);
int size = 0;
int len = 0;
byte[] buf = new byte[2048];
while ((size = bin.read(buf)) != -1) {
len += size;
out.write(buf, 0, size);
// 控制台打印文件下载的百分比情况
System.out.println("下载了-------> " + len * 100 / fileLength + "%\n");
}
// 关闭资源
bin.close();
out.close();
System.out.println("文件下载成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
return file;
}
}
/**
* @description 获取文件字节流
* @param file
* @author 小小舍
* @date 2019年9月3日
* @return
*/
public static byte[] getBytes(File file) {
FileInputStream fis = null;
byte[] buffer = null;
try {
fis = new FileInputStream(file);
buffer = new byte[(int) file.length()];
fis.read(buffer);
} catch (Exception e) {
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
}
}
}
return buffer;
}
/**
* @description 计算文件contentMd5值
* @param filePath
* @author 小小舍
* @date 2019年9月3日
* @return
* @throws Exception
*/
public static String getContentMD5(String filePath){
Encoder encoder = Base64.getEncoder();
// 获取文件Md5二进制数组(128位)
byte[] bytes = getFileMd5Bytes128(filePath);
// 对文件Md5的二进制数组进行base64编码(而不是对32位的16进制字符串进行编码)
return encoder.encodeToString(bytes);
}
/**
* @description 获取文件MIME类型
* @param filePath
* @author 小小舍
* @date 2019年9月3日
* @return
* @throws Exception
*/
public static String getContentType(String filePath){
Path path = Paths.get(filePath);
try {
return Files.probeContentType(path);
} catch (IOException e) {
try {
throw new Exception("获取文件MIME类型失败", e);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return filePath;
}
public static String getfileUrlContentType(String fileUrl) {
String contentType = null;
try {
contentType = new MimetypesFileTypeMap().getContentType(new File(fileUrl));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("getContentType, File ContentType is : " + contentType);
return contentType;
}
/**
* @description 根据文件路径,获取文件base64
* @param path
* @author 小小舍
* @date 2019年9月3日
* @return
* @throws Exception
*/
public static String getBase64Str(String path) throws Exception {
InputStream is = null;
try {
is = new FileInputStream(new File(path));
byte[] bytes = new byte[is.available()];
is.read(bytes);
return Base64.getEncoder().encodeToString(bytes);
} catch (Exception e) {
throw new Exception("获取文件输入流失败",e);
}finally {
if(is != null) {
try {
is.close();
} catch (IOException e) {
throw new Exception("关闭文件输入流失败",e);
}
}
}
}
/**
* @description 获取文件名称
* @param path 文件路径
* @author 小小舍
* @date 2019年9月3日
* @param path
* @return
*/
public static String getFileName(String path){
return new File(path).getName();
}
/**
* @description 获取文件大小
* @param path 文件路径
* @author 小小舍
* @date 2019年9月3日
* @param path
* @return
*/
public static String getFileLength(String path){
return new File(path).length()+"";
}
// ------------------------------公有方法end----------------------------------------------
// ------------------------------私有方法start--------------------------------------------
/**
* @description 获取文件Md5二进制数组(128位)
* @param filePath
* @author 小小舍
* @date 2019年9月3日
* @return
* @throws Exception
*/
private static byte[] getFileMd5Bytes128(String filePath){
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(filePath));
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer, 0, 1024)) != -1) {
md5.update(buffer, 0, len);
}
return md5.digest();
} catch (Exception e) {
try {
throw new Exception("获取文件md5二进制数组失败", e);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
try {
throw new Exception("关闭读写流失败", e);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
return null;
}
// ------------------------------私有方法end----------------------------------------------
}