package cn.jeesoft.core.utils;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import cn.jeesoft.mvc.Config;
import cn.jeesoft.mvc.helper.RequestHolder;
public class FileUtils {
private static final ExecutorService executor = Executors.newFixedThreadPool(10);;
public static enum FileType {
JPG,
JPEG,
PNG,
BMP,
GIF,
ICO,
UNKOWN
;
public static FileType getFileType(String fileName) {
if (StringUtils.isEmpty(fileName)) {
return FileType.UNKOWN;
}
fileName = fileName.toUpperCase();
for (FileType fileType : values()) {
if (fileName.endsWith(fileType.name())) {
return fileType;
}
}
return FileType.UNKOWN;
}
}
/**
* 根据文件名,获取文件类型
* @param fileName
* @return
*/
public static FileType getFileType(String fileName) {
return FileType.getFileType(fileName);
}
/**
* 根据文件,获取文件类型
* @param file
* @return
*/
public static FileType getFileType(File file) {
if (file == null) {
return FileType.UNKOWN;
}
return FileType.getFileType(file.getName());
}
/**
* 根据文件类型,生成随机文件名
* @param fileType
* @return
*/
public static String getRandomFileName(FileType fileType) {
if (fileType == FileType.UNKOWN) {
fileType = FileType.JPG;
}
return DateUtils.format(new Date(), "yyyyMMddHHmmsss") + StringUtils.getRandomNum(4)
+ "." + fileType.name().toLowerCase();
}
/**
* 根据原始文件名,生成随机文件名
* @param fileName
* @return
*/
public static String getRandomFileName(String fileName) {
return FileUtils.getRandomFileName(FileUtils.getFileType(fileName));
}
/**
* 获取工程根目录的路径
* @return
*/
public static String getRootPath() {
String rootDir = null;
try {
rootDir = RequestHolder.getSession().getServletContext().getRealPath("");
} catch (Exception e) {
}
if (StringUtils.isEmpty(rootDir)) {
rootDir = File.separator;
} else if (!rootDir.endsWith(File.separator)) {
rootDir += File.separator;
}
return rootDir;
}
/**
* 获取相对于工程的路径
* @return
*/
public static String getRelativePath(String path) {
if (StringUtils.isEmpty(path)) {
return null;
}
return getRelativePath(new File(path));
}
/**
* 获取相对于工程的路径
* @return
*/
public static String getRelativePath(File path) {
if (path == null) {
return null;
}
String rootDir = getRootPath();
String absPath = path.getAbsolutePath();
if (absPath.startsWith(rootDir)) {
return absPath.substring(rootDir.length() - 1);
}
return absPath;
}
/**
* 多文件上传保存
* @param request
* @return
*/
public static Map<String, File> saveMultipartFiles(HttpServletRequest request, String phone) {
Map<String, File> files = new HashMap<String, File>();
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 取得上传文件
MultipartFile multiFile = multiRequest.getFile(iter.next());
if (multiFile != null && !multiFile.isEmpty()) {
// 重命名上传后的文件名
String fileName = FileUtils.getRandomFileName(multiFile.getOriginalFilename());
// 定义上传路径
File uploadDir = new File(FileUtils.getRootPath(), "uploads");
uploadDir = new File(uploadDir, phone);
uploadDir.mkdir();
// 接收并保存上传的文件
final File uploadFile = new File(uploadDir, fileName);
try {
multiFile.transferTo(uploadFile);
files.put(multiFile.getName(), uploadFile);
// 异步执行图片压缩
executor.execute(new Runnable() {
@Override
public void run() {
Pic pic = new Pic(uploadFile);
pic.resizeBy(Config.MAX_IMAGE_WIDTH, Config.MAX_IMAGE_HEIGHT);
pic.save();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return files;
}
}