/**
* 文件工具类
*/
public class FileTools {
/**
* 文件上传配置
* @param req
* @param filePath
* @return
*/
public static Map<String,Object> uploadConfiguration(HttpServletRequest req,String filePath){
Map<String,Object> map = new HashMap<>();
String savePath = req.getServletContext().getRealPath("/" + filePath); // 获取文件保存路径
String temporaryPath = req.getServletContext().getRealPath("/temp"); // 获取临时文件保存路径
File temporaryFile = new File(temporaryPath); // 创建临时文件夹
if(!temporaryFile.exists() && temporaryFile.isDirectory()){
temporaryFile.mkdir(); // 生成单极目录
}
// 创建一个工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024); // 设置上传文件最大值
factory.setRepository(temporaryFile); // 设置临时上传路径
// 创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("utf-8");
// 监听文件上传速度
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long l, long l1, int i) {
System.out.println("文件的大小为:" + l1/1024 + "kb;已上传:" + l/1024 + "kb");
}
});
// 判断提交的数据是否是多部分表单
if(!ServletFileUpload.isMultipartContent(req)){
return null;
}
upload.setFileSizeMax(1024*1024*5); // 设置单个文件的大小
upload.setSizeMax(1024*1024*40); // 设置文件总量的大小
// 封装返回的数据
map.put("savePath",savePath); // 保存文件夹的父目录
map.put("servletFileUpload",upload); // 保存解析器
return map;
}
/**
* 保存文件
* @param fileItem
* @param savePath
* @return
*/
public static String saveFile(FileItem fileItem,String savePath){
try {
// 获得上传文件的名称(原始文件名称)
String fileName = fileItem.getName();
if(fileName==null||fileName.trim().equals("")){
return null;
}
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); // 截取文件名称,只保留文件名和后缀名
String saveFileName = FileTools.createFileName(fileName); // 获得文件保存的名称
String realSavePath = FileTools.createPath(saveFileName,savePath); // 获得文件保存的目录
InputStream inputStream = fileItem.getInputStream(); // 获得文件的输入流
// 创建一个文件输出流
FileOutputStream outputStream = new FileOutputStream(realSavePath + "\\" + saveFileName);
//创建一个缓冲区
byte buffer[] = new byte[1024];
int len = 0;
while((len = inputStream.read(buffer))>0){
outputStream.write(buffer,0,len);
}
//关闭流对象
inputStream.close();
outputStream.close();
// 删除临时对象
fileItem.delete();
// 保存到数据库的文件路径字符串
String imgPic = realSavePath.substring(realSavePath.indexOf("upload")) + "\\" + saveFileName;
return imgPic;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 生成随机的不重复的文件名
* @param fileName 上传文件的文件名
* @return
*/
private static String createFileName(String fileName){
return UUID.randomUUID().toString() + "-" + fileName;
}
/**
* 为防止目录下文件数目太多
* @param fileName 文件名
* @param savePath 文件存储路径
* @return
*/
private static String createPath(String fileName,String savePath){
// 得到文件名的hashcode值(字符串在内存中对应的地址)
int hashcode = fileName.hashCode();
//生成子文件夹名称
int dir1 = hashcode & 0xf; //0~15
int dir2 = (hashcode & 0x0) >> 4; //0~15
//构建新目录(在当前目录下创建子目录)
String dir = savePath + "\\" + dir1 + "\\" + dir2;
File file = new File(dir);
if(!file.exists()){ // 判断文件是否存在
//创建目录
if(file.mkdirs()){
return dir;
}
}
return null;
}
}
java文件上传工具类
最新推荐文章于 2024-08-06 12:52:47 发布