public void uploadBySlice(UploadFileReq uploadFileReq) {
byte[] bytes = uploadFileReq.getBytes();
if(bytes==null){
throw new ServiceException("请上传文件");
}
String base = sysConfig.getStaticArticleAccessPath().substring(0, sysConfig.getStaticArticleAccessPath().lastIndexOf("/") + 1);
String basePath = "/" + base + "temp";
String filePath = adaptSystem(CommonUtils.getProjectPath() + basePath);
String newFileName = uploadFileReq.getMd5Code() + "_" + uploadFileReq.getIndex() + ".tmp";
File f = new File(filePath, newFileName);
if(f.exists()){
f.delete();
}
boolean flag = FileUtils.fileWriteOut(bytes,filePath,newFileName);
if (flag == false) {
throw new ServiceException("文件上传失败");
}
redisUtil.setZSetValue(FILE_UPLOAD + uploadFileReq.getMd5Code(), "" + uploadFileReq.getIndex(), uploadFileReq.getIndex());
}
public Map mergeSlice(UploadFileReq uploadFileReq) throws IOException {
String md5Code = uploadFileReq.getMd5Code();
String base = sysConfig.getStaticArticleAccessPath().substring(0, sysConfig.getStaticArticleAccessPath().lastIndexOf("/") + 1);
String tempPath = "/" + base + "temp";//临时文件路径
String filePath = adaptSystem(CommonUtils.getProjectPath() + tempPath);
String fileName = uploadFileReq.getFileName();
String newFilePath = "/" + base + CommonUtils.createPath();
//合并后文件名
String basePath = adaptSystem(CommonUtils.getProjectPath() + newFilePath);
String newFileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
File f = new File(basePath, newFileName);
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
}
RandomAccessFile target = new RandomAccessFile(f, "rw");
for (Integer i = 0; i < uploadFileReq.getCount(); i++) {
RandomAccessFile r = null;
try {
r = new RandomAccessFile(new File(filePath, md5Code + "_" + i + ".tmp"), "r");
//合并文件
byte[] b = new byte[1024];
int n = 0;
while ((n = r.read(b)) != -1) {
target.write(b, 0, n);
}
} catch (FileNotFoundException e) {
log.warn("分片上传临时文件被人手动删除-->md5Code:{} -->index:{}", md5Code, i);
//删除redis上传分片成功数据,防止临时文件被删除导致多次上传失败
redisUtil.delete(FILE_UPLOAD + uploadFileReq.getMd5Code());
throw new ServiceException("文件上传不完整,请重新上传");
} finally {
if (r != null) {
r.close();
}
}
}
//合并成功后,删除临时文件
log.info("md5Code:{}文件合并成功,准备删除临时文件", md5Code);
deleteTempFile(filePath, md5Code, uploadFileReq.getCount());
redisUtil.setValue(FILE_UPLOAD + uploadFileReq.getMd5Code(), newFilePath + "/" +newFileName);
Map<String, String> res = new HashMap<>();
res.put("state", "SUCCESS");
res.put("original", fileName);
res.put("url", newFilePath + "/" +newFileName);
return res;
}
public Object getUrlOrSliceIndex(UploadFileReq uploadFileReq) {
String key = FILE_UPLOAD + uploadFileReq.getMd5Code();
DataType type = redisUtil.getType(key);
log.info("【getUrlOrSliceIndex】 key:{}, Type:{}", key, type.code());
if(DataType.NONE.equals(type)){
//没有上传过此文件
return null;
} else if (DataType.STRING.equals(type)){
//文件已经上传并合并成功,可以直接获取url
String url = redisUtil.get(FILE_UPLOAD + uploadFileReq.getMd5Code());
if (!StringUtils.isEmpty(url) && url.lastIndexOf(".") > -1) {
//此文件已经合并,防止有人手贱
File file = new File(url);
if (!file.exists()) {
redisUtil.delete(key);
return null;
} else {
return url;
}
}
} else if (DataType.ZSET.equals(type)){
//文件上传被中断,或者合并失败需要重新上传
Set<String> slices = redisUtil.setZSetRange(key, 0, -1);
return slices;
}
return null;
}