package com.app.mvc.business.service;
import com.app.mvc.beans.JsonMapper;
import com.app.mvc.business.bo.FileUploadBo;
import com.app.mvc.business.dao.FileInfoDao;
import com.app.mvc.business.domain.FileInfo;
import com.app.mvc.common.ThreadPool;
import com.app.mvc.config.GlobalConfig;
import com.app.mvc.config.GlobalConfigKey;
import com.app.mvc.util.DateTimeUtil;
import com.app.mvc.util.FileMD5Util;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.util.List;
import java.util.Random;
/**
* Created by jimin on 15/11/29.
*/
@Slf4j
@Service
public class FileInfoService {
@Resource
private FileInfoDao fileInfoDao;
public FileInfo findById(int id) {
return fileInfoDao.findById(id);
}
public List<FileUploadBo> handleUploadFiles(List<MultipartFile> fileList, String operator) throws Exception {
List<FileUploadBo> uploadFileList = Lists.newArrayList();
if (CollectionUtils.isEmpty(fileList)) {
return uploadFileList;
}
for (MultipartFile file : fileList) {
//记录上传过程起始时的时间,用来计算上传时间
int start = (int) System.currentTimeMillis();
String fileMD5 = "";
if (file != null) {
//取得当前上传文件的文件名称
String originalFilename = file.getOriginalFilename();
//如果名称不为“”,说明该文件存在,否则说明该文件不存在
if (originalFilename.trim() != "") {
// 判断文件是否已经上传过
fileMD5 = FileMD5Util.getMD5String(file.getBytes());
FileInfo fileInfo = fileInfoDao.findByMD5(fileMD5);
if (fileInfo != null) {
log.info("{}已经上传过,md5:{},file:{}", originalFilename, fileMD5, JsonMapper.obj2String(fileInfo));
uploadFileList.add(FileUploadBo.success(originalFilename, fileInfo.getName()));
continue;
}
//重命名上传后的文件名
String fileName = generateFilePrefix() + getSuffix(originalFilename);
//定义上传路径
String path = GlobalConfig.getValue(GlobalConfigKey.FILE_UPLOAD_PATH) + fileName;
File localFile = new File(path);
file.transferTo(localFile);
// 把文件上传信息保存到数据库中
fileInfo = new FileInfo(originalFilename, fileName, operator, fileMD5, file.getSize());
asyncSaveFileInfo(fileInfo);
uploadFileList.add(FileUploadBo.success(originalFilename, fileName));
}
//记录上传该文件后的时间
long time = System.currentTimeMillis() - start;
log.info("upload {} use time {}, size: {}, md5: {}", originalFilename, time, file.getSize(), fileMD5);
}
}
return uploadFileList;
}
private String generateFilePrefix() {
// yyyyMMddHHmmss + 1位随机数
return DateTimeUtil.allFrom(DateTime.now()) + "" + new Random().nextInt(10);
}
private String getSuffix(String fileName) {
int index = fileName.lastIndexOf(".");
if (index == -1) {
return ""; // 无后缀
}
return fileName.substring(index);
}
private void asyncSaveFileInfo(final FileInfo fileInfo) {
ThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
fileInfoDao.insert(fileInfo);
} catch (Throwable e) {
log.error("async insert file info error, {}", JsonMapper.obj2String(fileInfo), e);
}
}
});
}
}