package com.tj.demo.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;
@Slf4j
public abstract class TjFileUtils {
/**
* 处理前端的上传文件
*
* @param file 文件
* @param relativeDir 相对路径,如果指定保存路径,则使用指定路径,否则使用默认路径
* @param filename 如果指定文件名,就是使用指定文件名,否则使用UUID命名
* @return 保存的文件全路径
*/
public static String handleUpFileRelativePath(MultipartFile file, String relativeDir, String filename) throws IOException {
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除
//获取原始文件名
String originalFilename = file.getOriginalFilename();
//获取原始文件名的后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//判断是否指定了文件名称
if (filename == null) {
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
filename = UUID.randomUUID().toString() + suffix;
}
//判断是否指定了保存路径
if (relativeDir == null) {
//将文件转存到指定路径
relativeDir = "TjFiles/";
}
//创建一个目录对象
File dir = new File(relativeDir);
//如果目录不存在,则创建目录
if (!dir.exists()) dir.mkdirs();
//通过文件流保存,可以设置相对路径
//获取输入流
InputStream inputStream = file.getInputStream();
//设置输出流
OutputStream outputStream = new FileOutputStream(new File(relativeDir + filename));
FileCopyUtils.copy(inputStream, outputStream);
return relativeDir + filename;
}
/**
* 处理前端的上传文件
*
* @param file 文件
* @param absoluteDir 绝对路径 如果指定保存路径,则使用指定路径,否则使用默认路径
* @param filename 如果指定文件名,就是使用指定文件名,否则使用UUID命名
* @return 保存的文件全路径
*/
public static String handleUploadFileAbsolutePath(MultipartFile file, String absoluteDir, String filename) throws IOException {
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后就会被删除
//获取原始文件名
String originalFilename = file.getOriginalFilename();
//获取原始文件名的后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//判断是否指定了文件名称
if (filename == null) {
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
filename = UUID.randomUUID().toString() + suffix;
}
//判断是否指定了保存路径
if (absoluteDir == null) {
//将文件转存到指定路径
absoluteDir = "C:/TjFiles";
}
//创建一个目录对象
File dir = new File(absoluteDir);
//如果目录不存在,则创建目录
if (!dir.exists()) dir.mkdirs();
//保存文件
//transferTo只能保存到绝对路径,相对路径默认是在tomcat下的路径。
file.transferTo(new File(absoluteDir + filename));
return absoluteDir + filename;
}
/**
* 根据url下载图片,前端可以通过该链接显示图片
*
* @param response HttpServletResponse
* @param url 图片的全路径
*/
public static void showPictureByUrl(HttpServletResponse response, String url) {
//设置响应格式
response.setContentType("image/jpeg");
try (// 把原始的字节输入流包装成高级的缓冲字节输入流
// 输入流,通过输入流读取文件内容
InputStream bis = new BufferedInputStream(new FileInputStream(new File(url)));
// 把原始的字节输出流包装成高级的缓冲字节输出流
//输出流,通过输出流将文件写回浏览器,在浏览器展示图片了
OutputStream bos = new BufferedOutputStream(response.getOutputStream());
) { // 定义一个字节数组转移数据
byte[] buffer = new byte[1024];
int len;//记录每次读取的字节数
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len); //读多少,输出多少
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 把对象保存到本地文件中
*
* @param obj Java对象
* @param path 相对路径含文件名
*/
public static void writeObjectToFile(Object obj, String path) {
try {
makeDirs(path);//如果路径里的文件夹没有,则创建文件夹
// 对象字节输出流
ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream(path));
objOut.writeObject(obj);
objOut.flush();
objOut.close();
log.info("对象保存文件-成功!");
} catch (IOException e) {
log.warn("对象保存文件-失败");
e.printStackTrace();
}
}
/**
* 从指定路径中读取对象
*
* @param path 文件路径含文件名
* @return 对象数据可以通过(Java对象名)Object 对应到对象数据结构中
*/
public static Object readObjectFromFile(String path) {
try {
//创建对象字节输入流管道包装低级的字节输入流管道
ObjectInputStream objInput = new ObjectInputStream(new FileInputStream(path));
//调用对象字节输入流的反序列化方法
Object o = objInput.readObject();
objInput.close();
return o;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 判断文件夹是否存在,如果不
*
* @param path 带有文件名的全路径
*/
private static void makeDirs(String path) {
//创建一个file对象
File file = new File(path);
//获取文件夹路径
String parent = file.getParent(); //获取自己的文件夹
//如果目录不存在,则创建目录
if (parent != null) {
File dir = new File(parent);
if (!dir.exists()) dir.mkdirs();
}
}
}