
top.javatool.fileupload.FileUpload Maven / Gradle / Ivy
The newest version!
package top.javatool.fileupload;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.web.multipart.MultipartFile;
import top.javatool.fileupload.exception.FileTypeException;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 上传工具类
* Created by yang peng on 2016/8/9.
*/
public class FileUpload {
private String filePath;
private String filePrefix;
private String fileType;
private String fileHeader;
private String ip;
private String host;
public FileUpload() {
}
public FileUpload(String filePath, String filePrefix, String fileType, String fileHeader, String ip, String host) {
this.filePath = filePath;
this.filePrefix = filePrefix;
this.fileType = fileType;
this.fileHeader = fileHeader;
this.ip = ip;
this.host = host;
}
private static final String HTTP = "http";
private static final int HTTP_PORT = 80;
private static final int HTTPS_PORT = 443;
private static final String HTTPS = "https";
private static final String IMAGE_HEADER = "FFD8FF,89504E47,47494638,49492A00,424D";
private static final String IMAGE_TYPE = "jpg,gif,png,bmp,jpeg";
private ExecutorService executorService = Executors.newFixedThreadPool(10);
/**
* save file and return image url
*
* @param file
* @param request
* @return
* @throws FileTypeException
* @throws IOException
*/
public String saveFile(MultipartFile file, HttpServletRequest request) throws FileTypeException, IOException {
checkFileType(file);
String fileName = getFileName(file);
String datePath = getDatePath();
File f = new File(filePath.concat(datePath));
if (!f.exists()) {
f.mkdirs();
}
String pathConcatFile = datePath.concat(fileName);
saveFile(filePath.concat(pathConcatFile), file);
String urlPath = getUrlPath(request, pathConcatFile);
return urlPath;
}
public List saveFile(MultipartFile[] file, HttpServletRequest request) throws FileTypeException,
IOException {
List strings = new ArrayList<>();
for (int i = 0; i < file.length; i++) {
String s = saveFile(file[i], request);
strings.add(s);
}
return strings;
}
public String saveImage(MultipartFile file, HttpServletRequest request) throws
FileTypeException,
IOException {
fileHeader = IMAGE_HEADER;
fileType = IMAGE_TYPE;
String url = saveFile(file, request);
return url;
}
public void asyncSaveFile(final MultipartFile file, final HttpServletRequest request) {
executorService.execute(new Runnable() {
public void run() {
try {
saveFile(file, request);
} catch (FileTypeException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
public void asyncSaveFile(final MultipartFile[] files, final HttpServletRequest request) {
for (int i = 0; i < files.length; i++) {
asyncSaveFile(files[i], request);
}
}
public void deleteImage(List imageUrls) {
for (String image : imageUrls) {
deleteImage(image);
}
}
public void deleteImage(String imageUrl) {
int i = imageUrl.lastIndexOf("/");
StringBuilder sb;
sb = new StringBuilder().append(filePath).append(filePrefix).append(imageUrl.substring(imageUrl.lastIndexOf("/", i - 1)).replaceFirst("/", ""));
File file = new File(sb.toString());
file.delete();
}
/**
* let filePrefix concat date
*
* @return
*/
private String getDatePath() {
String date = DateFormatUtils.format(new Date(), "yyyy-MM-dd");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(filePrefix).append(date).append("/");
return stringBuilder.toString();
}
/**
* create a random file name
* rule now date + random 6 num + file extension name
*
* @param headImg
* @return
*/
private String getFileName(MultipartFile headImg) {
// 获取图片的文件名
String fileName = headImg.getOriginalFilename();
// 获取图片的扩展名
String extensionName = fileName.substring(fileName.lastIndexOf(".") + 1);
// 新的图片文件名 = 获取时间戳+"."图片扩展名
StringBuilder sb = new StringBuilder();
sb.append(System.currentTimeMillis()).append(RandomStringUtils.randomNumeric(6)).append(".").append(extensionName);
return sb.toString();
}
/**
* save file
*
* @return
*/
private void saveFile(String fileName, MultipartFile file) throws IOException {
file.transferTo(new File(fileName));
}
/**
* get the file url path
*
* @return
*/
private String getUrlPath(HttpServletRequest request, String pathConcatFile) throws
UnknownHostException {
StringBuilder sb = new StringBuilder();
sb.append(request.getScheme()).append("://").append(getHost(request)).append(getPort(request)).append("/").append(pathConcatFile);
return sb.toString();
}
/**
* @param request
* @return
* @throws UnknownHostException
*/
private String getHost(HttpServletRequest request) throws UnknownHostException {
if (StringUtils.isNotEmpty(ip)) {
InetAddress address = InetAddress.getByName(ip);
String host = address.getHostName();
return host;
}
if (StringUtils.isNotEmpty(host)) {
return host;
}
return request.getServerName();
}
/**
* @param request
* @return
*/
private String getPort(HttpServletRequest request) {
int serverPort = request.getServerPort();
String scheme = request.getScheme();
if (scheme.equals(HTTP)) {
if (serverPort == HTTP_PORT) {
return StringUtils.EMPTY;
}
}
if (scheme.equals(HTTPS)) {
if (serverPort == HTTPS_PORT) {
return StringUtils.EMPTY;
}
}
return String.valueOf(serverPort);
}
/**
* 根据文件的输入流获取文件头信息
*
* @return 文件头信息
*/
private String getFileHeader(InputStream is) {
byte[] b = new byte[4];
if (is != null) {
try {
is.read(b, 0, b.length);
} catch (IOException e) {
e.printStackTrace();
}
}
return bytesToHexString(b);
}
/**
* 将要读取文件头信息的文件的byte数组转换成string类型表示
*
* @param src 要读取文件头信息的文件的byte数组
* @return 文件头信息
*/
private String bytesToHexString(byte[] src) {
StringBuilder builder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
String hv;
for (int i = 0; i < src.length; i++) {
// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
if (hv.length() < 2) {
builder.append(0);
}
builder.append(hv);
}
return builder.toString();
}
/**
* 判断上传的文件是否合法
* (一)、第一:检查文件的扩展名,
* (二)、 第二:检查文件的MIME类型 。
*/
private void checkFileType(MultipartFile file) throws IOException, FileTypeException {
String fileName = file.getOriginalFilename();
String extensionName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (StringUtils.isNotEmpty(fileType)) {
Set fileTypeSet = new HashSet<>(Arrays.asList(fileType.split(",")));
if (!fileTypeSet.contains(extensionName)) {
throw new FileTypeException(extensionName + " extension name is forbid");
}
}
if (StringUtils.isNotEmpty(fileHeader)) {
Set fileHeaderSet = new HashSet<>(Arrays.asList(fileHeader.split(",")));
String header = getFileHeader(file.getInputStream());
if (!checkHeader(fileHeaderSet, header)) {
throw new FileTypeException(header + " file header is forbid");
}
}
}
private Boolean checkHeader(Set fileHeaderSet, String header) {
for (String fileHeader : fileHeaderSet) {
if (header.contains(fileHeader)) {
return true;
}
}
return false;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFilePrefix() {
return filePrefix;
}
public void setFilePrefix(String filePrefix) {
this.filePrefix = filePrefix;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public String getFileHeader() {
return fileHeader;
}
public void setFileHeader(String fileHeader) {
this.fileHeader = fileHeader;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy