package com.hx.util;
|
|
import com.hx.exception.TipsException;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.*;
|
import java.net.FileNameMap;
|
import java.net.URLConnection;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
|
/** 文件处理工具
|
* @author ChenJiaHe
|
* @Date 2020-06-17
|
*/
|
public class FileUtils {
|
|
private final static Logger logger = LoggerFactory.getLogger(FileUtils.class);
|
|
private static int BUFFER_SIZE = 1024;
|
|
/**
|
* @param path
|
* @MethodName fileIsExists
|
* @Description 文件是否存在
|
* @Author ChenJiaHe
|
* @Date 2019/9/7 9:13
|
* @Since JDK 1.8
|
*/
|
public static boolean fileIsExists(String path) {
|
File file = new File(path);
|
if (file.exists()) {
|
return true;
|
} else {
|
return false;
|
}
|
}
|
|
/**
|
* @param sourceFile
|
* @param targetFile
|
* @MethodName copyFile
|
* @Description 复制文件
|
* @Author ChenJiaHe
|
* @Date 2019/9/7 9:36
|
* @Since JDK 1.8
|
*/
|
public static void copyFile(File sourceFile, File targetFile) throws IOException {
|
BufferedInputStream inputStream = null;
|
BufferedOutputStream outputStream = null;
|
try {
|
inputStream = new BufferedInputStream(new FileInputStream(sourceFile));
|
outputStream = new BufferedOutputStream(new FileOutputStream(targetFile));
|
byte[] b = new byte[BUFFER_SIZE];
|
int len;
|
while ((len = inputStream.read(b)) != -1) {
|
outputStream.write(b, 0, len);
|
}
|
outputStream.flush();
|
} catch (Exception e) {
|
logger.error("copy file error", e);
|
} finally {
|
if (inputStream != null) {
|
inputStream.close();
|
}
|
if (outputStream != null) {
|
outputStream.close();
|
}
|
}
|
}
|
|
/**
|
* @param path
|
* @param fileType 文件类型,0 = 文件夹 1 = 文件
|
* @MethodName getAllFiles
|
* @Description 讀取文件夹下的,不包括子文件夹内
|
* @Author ChenJiaHe
|
* @Date 2019/9/17 15:56
|
* @Since JDK 1.8
|
*/
|
public static List<String> getAllFiles(String path, String fileType) {
|
List<String> fileList = new ArrayList<>();
|
File fileDic = new File(path);
|
File[] files = fileDic.listFiles();
|
for (File file : files) {
|
if ("1".equals(fileType)) {
|
if (file.isFile()) {
|
fileList.add(file.toString());
|
}
|
}
|
if ("0".equals(fileType)) {
|
if (file.isDirectory()) {
|
fileList.add(file.toString());
|
}
|
}
|
}
|
return fileList;
|
}
|
|
/**
|
* @param path
|
* @MethodName getFolderFiles
|
* @Description 递归获取所有包括子文件夹的文件
|
* @Author ChenJiaHe
|
* @Date 2019/9/17 16:11
|
* @Since JDK 1.8
|
*/
|
public static void getAllFileName(String path, List<String> listFileName) {
|
try {
|
File file = new File(path);
|
File[] files = file.listFiles();
|
String[] names = file.list();
|
if (names != null) {
|
String[] completNames = new String[names.length];
|
for (int i = 0; i < names.length; i++) {
|
completNames[i] = path + names[i];
|
}
|
listFileName.addAll(Arrays.asList(completNames));
|
}
|
for (File a : files) {
|
// 如果文件夹下有子文件夹,获取子文件夹下的所有文件全路径。
|
if (a.isDirectory()) {
|
getAllFileName(a.getAbsolutePath() + "\\", listFileName);
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 读取文件内容,作为字符串返回
|
*/
|
public static String readFileAsString(String filePath) throws IOException {
|
File file = new File(filePath);
|
if (!file.exists()) {
|
throw new FileNotFoundException(filePath);
|
}
|
|
if (file.length() > 1024 * 1024 * 1024) {
|
throw new IOException("File is too large");
|
}
|
|
StringBuilder sb = new StringBuilder((int) (file.length()));
|
// 创建字节输入流
|
FileInputStream fis = new FileInputStream(filePath);
|
// 创建一个长度为10240的Buffer
|
byte[] bbuf = new byte[10240];
|
// 用于保存实际读取的字节数
|
int hasRead = 0;
|
while ( (hasRead = fis.read(bbuf)) > 0 ) {
|
sb.append(new String(bbuf, 0, hasRead));
|
}
|
fis.close();
|
return sb.toString();
|
}
|
|
/**
|
* 根据文件路径读取byte[] 数组
|
*/
|
public static byte[] readFileByBytes(String filePath) throws IOException {
|
File file = new File(filePath);
|
if (!file.exists()) {
|
throw new FileNotFoundException(filePath);
|
} else {
|
ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
|
BufferedInputStream in = null;
|
|
try {
|
in = new BufferedInputStream(new FileInputStream(file));
|
short bufSize = 1024;
|
byte[] buffer = new byte[bufSize];
|
int len1;
|
while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
|
bos.write(buffer, 0, len1);
|
}
|
|
byte[] var7 = bos.toByteArray();
|
return var7;
|
} finally {
|
try {
|
if (in != null) {
|
in.close();
|
}
|
} catch (IOException var14) {
|
var14.printStackTrace();
|
}
|
|
bos.close();
|
}
|
}
|
}
|
|
|
/**
|
* 2020-06-29
|
* cjh
|
* 图片格式判断
|
* */
|
public static boolean imageFormatJudge(MultipartFile firs) {
|
String imageName = firs.getOriginalFilename();
|
//截取格式
|
String suffix =imageName.substring(imageName.lastIndexOf(".") + 1);
|
//格式字母转小写
|
suffix = suffix.toLowerCase();
|
//进行判断
|
if(suffix.equals("png")) {
|
return true;
|
}else if(suffix.equals("jpg")){
|
return true;
|
}else if(suffix.equals("jpeg")){
|
return true;
|
}else {
|
return false;
|
}
|
}
|
|
/**视频上传的方法
|
* 保存到服务器里面的
|
* @param platformIconFile 视频文件
|
* @param unifiedFolder NG指向的前端文件夹(统一文件夹),如:user/local/images/
|
* @param saveFolder 保存到的文件夹,如:/bananer/
|
* @param autoDateFolder 是否生成日期文件夹
|
* @return 图片路径
|
* 2020-06-29 ChenJiaHe
|
*/
|
public static String videoFileUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder
|
,boolean autoDateFolder) {
|
String fileName = "";
|
try {
|
if(platformIconFile == null) {
|
throw new TipsException("请上传视频文件!");
|
}
|
if(!getMimeType(platformIconFile.getOriginalFilename())){
|
throw new TipsException("请上传视频格式的文件!");
|
}
|
|
//设置图片大小
|
// String.format("%.1f",platformIconFile.getSize()/1024.0);
|
if(autoDateFolder){
|
if(saveFolder.endsWith("/")){
|
saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/";
|
}else{
|
saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/";
|
}
|
}
|
fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS");
|
if(unifiedFolder.endsWith("/")){
|
if(saveFolder.startsWith("/")){
|
saveFolder = saveFolder.replaceFirst("/","");
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+saveFolder;
|
}
|
}else{
|
if(saveFolder.startsWith("/")){
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+"/"+saveFolder;
|
}
|
}
|
fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName);
|
} catch (RuntimeException e) {
|
e.printStackTrace();
|
}
|
return fileName;
|
}
|
|
/**图片上传的方法
|
* 保存到服务器里面的
|
* @param platformIconFile 图片文件
|
* @param unifiedFolder NG指向的前端文件夹(统一文件夹),如:user/local/images/
|
* @param saveFolder 保存到的文件夹,如:/bananer/
|
* @param autoDateFolder 是否生成日期文件夹
|
* @return 图片路径
|
* 2020-06-29 ChenJiaHe
|
*/
|
public static String handleFileUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder
|
,boolean autoDateFolder) {
|
String fileName = "";
|
try {
|
if(platformIconFile == null) {
|
throw new TipsException("请上传图片!");
|
}
|
if(!imageFormatJudge(platformIconFile)) {
|
throw new TipsException("请上传png、jpg和jpeg格式的图片!");
|
}
|
|
//设置图片大小
|
// String.format("%.1f",platformIconFile.getSize()/1024.0);
|
if(autoDateFolder){
|
if(saveFolder.endsWith("/")){
|
saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/";
|
}else{
|
saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/";
|
}
|
}
|
fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS");
|
if(unifiedFolder.endsWith("/")){
|
if(saveFolder.startsWith("/")){
|
saveFolder = saveFolder.replaceFirst("/","");
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+saveFolder;
|
}
|
}else{
|
if(saveFolder.startsWith("/")){
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+"/"+saveFolder;
|
}
|
}
|
fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName);
|
} catch (RuntimeException e) {
|
e.printStackTrace();
|
}
|
return fileName;
|
}
|
|
/**
|
* 音频上传
|
* @param platformIconFile
|
* @param unifiedFolder
|
* @param saveFolder
|
* @param autoDateFolder
|
* @return
|
*/
|
public static String handleAudioUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder
|
,boolean autoDateFolder) {
|
String fileName = "";
|
try {
|
if(platformIconFile == null) {
|
throw new TipsException("请上传音频!");
|
}
|
|
if(autoDateFolder){
|
if(saveFolder.endsWith("/")){
|
saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/";
|
}else{
|
saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/";
|
}
|
}
|
|
fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS");
|
if(unifiedFolder.endsWith("/")){
|
if(saveFolder.startsWith("/")){
|
saveFolder = saveFolder.replaceFirst("/","");
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+saveFolder;
|
}
|
}else{
|
if(saveFolder.startsWith("/")){
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+"/"+saveFolder;
|
}
|
}
|
fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName);
|
} catch (RuntimeException e) {
|
e.printStackTrace();
|
}
|
return fileName;
|
}
|
|
/**
|
* 文件上传
|
* @param platformIconFile
|
* @param unifiedFolder
|
* @param saveFolder
|
* @param autoDateFolder
|
* @return
|
*/
|
public static String handleOtherFileUpload(MultipartFile platformIconFile,String unifiedFolder,String saveFolder
|
,boolean autoDateFolder) {
|
String fileName = "";
|
try {
|
if(platformIconFile == null) {
|
throw new TipsException("请上传文件!");
|
}
|
|
if(autoDateFolder){
|
if(saveFolder.endsWith("/")){
|
saveFolder = saveFolder+dateFormat(new Date(),"yyyyMM")+"/";
|
}else{
|
saveFolder = saveFolder+"/"+dateFormat(new Date(),"yyyyMM")+"/";
|
}
|
}
|
|
fileName = dateFormat(new Date(),"yyyyMMddHHmmssSSS");
|
if(unifiedFolder.endsWith("/")){
|
if(saveFolder.startsWith("/")){
|
saveFolder = saveFolder.replaceFirst("/","");
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+saveFolder;
|
}
|
}else{
|
if(saveFolder.startsWith("/")){
|
unifiedFolder = unifiedFolder + saveFolder;
|
}else{
|
unifiedFolder = unifiedFolder+"/"+saveFolder;
|
}
|
}
|
fileName = saveFolder+fileUp(platformIconFile,unifiedFolder,fileName);
|
} catch (RuntimeException e) {
|
e.printStackTrace();
|
}
|
return fileName;
|
}
|
|
/**
|
* 2020-06-29 ChenJiaHe
|
* @param file //文件对象
|
* @param filePath //上传路径
|
* @param fileName //文件名
|
* @return 文件名
|
*/
|
public static String fileUp(MultipartFile file, String filePath, String fileName){
|
String extName = ""; // 扩展名格式:
|
try {
|
if (file.getOriginalFilename().lastIndexOf(".") >= 0){
|
extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
|
}
|
copyFile(file.getInputStream(), filePath, fileName+extName).replaceAll("-", "");
|
} catch (IOException e) {
|
System.out.println(e);
|
}
|
return fileName+extName;
|
}
|
|
/**
|
* 写文件到当前目录的upload目录中
|
*
|
* @param in
|
* @param fileName
|
* @throws IOException
|
*/
|
private static String copyFile(InputStream in, String dir, String realName)throws IOException {
|
File file = new File(dir, realName);
|
file.setWritable(true);
|
if (!file.exists()) {
|
if (!file.getParentFile().exists()) {
|
file.getParentFile().mkdirs();
|
}
|
file.createNewFile();
|
}
|
org.apache.commons.io.FileUtils.copyInputStreamToFile(in, file);
|
return realName;
|
}
|
|
/**
|
*
|
* @param date 时间
|
* @param format 时间格式
|
* @return 返回的时间格式字符串
|
*/
|
public static String dateFormat(Date date,String format) {
|
SimpleDateFormat df = new SimpleDateFormat(format);//设置日期格式
|
return df.format(date);
|
}
|
|
|
/**
|
* @param stream 文件流
|
* @param saveUrl 保存到的文件夹
|
* @param fileName 文件图片
|
* @return
|
* @throws IOException
|
*/
|
public static File inputStreamToFile(InputStream stream,String saveUrl,String fileName) throws IOException {
|
if(saveUrl.endsWith("/")){
|
saveUrl = saveUrl + fileName;
|
}else{
|
saveUrl = saveUrl +"/"+ fileName;
|
}
|
File targetFile = new File(saveUrl);
|
org.apache.commons.io.FileUtils.copyInputStreamToFile(stream, targetFile);
|
return targetFile;
|
}
|
|
/**判断是不是视频文件
|
* @param fileName 文件名称
|
* @return boolean true是视频文件
|
*/
|
public static boolean getMimeType(String fileName) {
|
boolean b = false;
|
FileNameMap fileNameMap = URLConnection.getFileNameMap();
|
String type = fileNameMap.getContentTypeFor(fileName);
|
//是视频type是为空的
|
if(StringUtils.isEmpty(type)) {
|
b = true;
|
}
|
return b;
|
}
|
|
/**
|
* 判断是否为视频
|
* @param fileName
|
* @return
|
*/
|
public static String isVideo(String fileName) {
|
FileNameMap fileNameMap = URLConnection.getFileNameMap();
|
String type = fileNameMap.getContentTypeFor(fileName);
|
return type;
|
}
|
|
|
}
|