package com.openailab.oascloud.file.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Maps;
import com.openailab.oascloud.common.enums.ResponseEnum;
import com.openailab.oascloud.common.model.ResponseResult;
import com.openailab.oascloud.common.model.tcm.ResourceBO;
import com.openailab.oascloud.common.model.tcm.vo.ResourceVO;
import com.openailab.oascloud.common.model.um.FileUserBO;
import com.openailab.oascloud.file.common.config.BootstrapConfig;
import com.openailab.oascloud.file.common.consts.BootstrapConst;
import com.openailab.oascloud.file.common.consts.RedisPrefixConst;
import com.openailab.oascloud.file.common.enums.ResourceTypeEnum;
import com.openailab.oascloud.file.common.enums.TranscodingStateEnum;
import com.openailab.oascloud.file.common.enums.VedioEnum;
import com.openailab.oascloud.file.common.file.ClientFactory;
import com.openailab.oascloud.file.common.file.FileClient;
import com.openailab.oascloud.file.common.helper.FileManagementHelper;
import com.openailab.oascloud.file.dao.FileDao;
import com.openailab.oascloud.file.dao.RedisDao;
import com.openailab.oascloud.file.model.LoginUserInfo;
import com.openailab.oascloud.file.service.IFileService;
import com.openailab.oascloud.file.util.*;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @description: 文件管理-service
* @author: zhangzhixiang
* @createDate: 2019/12/9
* @version: 1.0
*/
@Service
public class FileServiceImpl implements IFileService {
private final static Logger LOG = LoggerFactory.getLogger(FileServiceImpl.class);
private static final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
@Autowired
private FileDao fileDao;
@Autowired
private BootstrapConfig bootstrapConfig;
@Autowired
private FileManagementHelper fileManagementHelper;
@Autowired
private PageObjUtils pageObjUtils;
@Autowired
private RedisDao redisDao;
private String getUploadPath() {
return bootstrapConfig.getFileRoot() + bootstrapConfig.getUploadDir() + "/";
}
private String getFileFolderPath(String fileMd5) {
return getUploadPath() + fileMd5.substring(0, 1) + "/" + fileMd5.substring(1, 2) + "/";
}
private String getFilePath(String fileMd5, String fileExt) {
return getFileFolderPath(fileMd5) + fileMd5 + "." + fileExt;
}
private String getFileRelativePath(String fileMd5, String fileExt) {
return bootstrapConfig.getUploadDir() + "/" + fileMd5.substring(0, 1) + "/" + fileMd5.substring(1, 2) + "/" + fileMd5 + "." + fileExt;
}
private String getChunkFileFolderPath(String fileMd5) {
return bootstrapConfig.getFileRoot() + bootstrapConfig.getBreakpointDir() + "/" + fileMd5 + "/";
}
@Override
public ResponseResult breakpointRegister(String fileMd5, String fileName, Long fileSize, String mimetype, String fileExt) {
Map<String, String> ret = Maps.newHashMap();
// 检查文件是否存在于磁盘
String fileFolderPath = this.getFileFolderPath(fileMd5);
String filePath = this.getFilePath(fileMd5, fileExt);
File file = new File(filePath);
boolean exists = file.exists();
// 检查文件是否存在于PostgreSQL中 (文件唯一标识为 fileMd5)
ResourceBO resourceBO = new ResourceBO();
resourceBO.setFileMd5(fileMd5);
resourceBO.setIsDelete(0);
List<ResourceBO> resourceBOList = fileDao.selectResourceByCondition(resourceBO);
if (exists && resourceBOList.size() > 0) {
// 既存在于磁盘又存在于数据库说明该文件存在,直接返回resId、filePath
resourceBO = resourceBOList.get(0);
ret.put("filePath", resourceBO.getFilePath());
ret.put("resId", String.valueOf(resourceBO.getResourceId()));
return ResponseResult.fail(ResponseEnum.RESPONSE_CODE_BREAKPOINT_RENEVAL_REGISTRATION_ERROR, ret);
}
//若磁盘中存在,但数据库中不存在,则生成resource记录并存入redis中
if (resourceBOList.size() == 0) {
// 首次断点叙传的文件需要创建resource新记录并返回redId,并存入redis中
resourceBO.setType(fileManagementHelper.judgeDocumentType(fileExt));
resourceBO.setStatus(TranscodingStateEnum.UPLOAD_NOT_COMPLETED.getCode());
resourceBO.setFileSize(fileSize);
resourceBO.setFileMd5(fileMd5);
resourceBO.setFileName(fileName);
resourceBO.setCreateDate(new Date());
resourceBO.setIsDelete(0);
final Integer resourceId = fileDao.addResource(resourceBO);
resourceBO.setResourceId(resourceId);
redisDao.set(RedisPrefixConst.BREAKPOINT_PREFIX + fileMd5, JSONObject.toJSONString(resourceBO), RedisPrefixConst.EXPIRE);
}
//如果redis中不存在,但数据库中存在,则存入redis中
String breakpoint = redisDao.get(RedisPrefixConst.BREAKPOINT_PREFIX + fileMd5);
if (StringUtils.isEmpty(breakpoint) && resourceBOList.size() > 0) {
resourceBO = resourceBOList.get(0);
redisDao.set(RedisPrefixConst.BREAKPOINT_PREFIX + fileMd5, JSONObject.toJSONString(resourceBO), RedisPrefixConst.EXPIRE);
}
// 若文件不存在则检查文件所在目录是否存在
File fileFolder = new File(fileFolderPath);
if (!fileFolder.exists()) {
// 不存在创建该目录 (目录就是根据前端传来的MD5值创建的)
fileFolder.mkdirs();
}
return ResponseResult.success(null);
}
@Override
public ResponseResult breakpointRenewal(MultipartFile file, String fileMd5, Integer chunk) {
Map<String, String> ret = Maps.newHashMap();
// 检查分块目录是否存在
String chunkFileFolderPath = this.getChunkFileFolderPath(fileMd5);
File chunkFileFolder = new File(chunkFileFolderPath);
if (!chunkFileFolder.exists()) {
chunkFileFolder.mkdirs();
}
// 上传文件输入流
File chunkFile = new File(chunkFileFolderPath + chunk);
try (InputStream inputStream = file.getInputStream(); FileOutputStream outputStream = new FileOutputStream(chunkFile)) {
IOUtils.copy(inputStream, outputStream);
// redis中查找是否有fileMd5的分块记录(resId)
String breakpoint = redisDao.get(RedisPrefixConst.BREAKPOINT_PREFIX + fileMd5);
ResourceBO resourceBO = new ResourceBO();
if (!StringUtils.isEmpty(breakpoint)) {
// 存在分块记录说明资源正在上传中,直接返回fileMd5对应的resId,且不再重复创建resource记录
resourceBO = JSONObject.parseObject(breakpoint, ResourceBO.class);
ret.put("resId", String.valueOf(resourceBO.getResourceId()));
}
} catch (IOException e) {
e.printStackTrace();
}
return ResponseResult.success(ret);
}
@Override
public ResponseResult checkChunk(String fileMd5, Integer chunk, Integer chunkSize) {
// 检查分块文件是否存在
String chunkFileFolderPath = this.g
没有合适的资源?快使用搜索试试~ 我知道了~
openailab-file-management.zip
共46个文件
java:40个
properties:2个
xml:2个
3星 · 超过75%的资源 需积分: 13 25 下载量 80 浏览量
2020-01-21
12:07:53
上传
评论
收藏 61KB ZIP 举报
温馨提示
大文件断点续传后端代码,经过线上完备测试,完整版前端代码,基于百度Webuploder组件对文件进行分割和上传,绝对可用(前端断点续传代码请见本人另一个资源)。
资源推荐
资源详情
资源评论
收起资源包目录
openailab-file-management.zip (46个子文件)
openailab-file-management
src
test
java
SiteInfoBean.java 1KB
FileAccessI.java 704B
FileSplitterFetch.java 2KB
Utility.java 410B
TestMethod.java 668B
SiteFileFetch.java 8KB
TranscodeTest.java 4KB
main
resources
application.properties 769B
logback-spring.xml 2KB
application-remote.properties 178B
java
com
openailab
oascloud
file
common
helper
SpringHelper.java 2KB
FileManagementHelper.java 6KB
config
BootstrapConfig.java 912B
enums
DocumentEnum.java 1KB
ImageEnum.java 2KB
VedioEnum.java 1KB
ResourceTypeEnum.java 1KB
TranscodingStateEnum.java 1KB
consts
BootstrapConst.java 921B
RedisPrefixConst.java 656B
file
CephClient.java 5KB
FileClient.java 1KB
ClientFactory.java 969B
service
impl
UserServiceImpl.java 2KB
FileServiceImpl.java 25KB
IUserService.java 350B
IFileService.java 4KB
model
PageVO.java 699B
LoginUserInfo.java 382B
FileAccessI.java 823B
FileSplitterFetch.java 2KB
controller
BaseController.java 2KB
FileController.java 9KB
dao
FileDao.java 3KB
UserFeignClient.java 897B
RedisDao.java 3KB
util
EncryptUtil.java 20KB
PageObjUtils.java 927B
GZIPUtil.java 3KB
Byte2InputStream.java 6KB
FileUtil.java 4KB
FileManagementApplication.java 855B
api
IFileController.java 6KB
Dockerfile 253B
pom.xml 5KB
openailab-file-management.iml 20KB
共 46 条
- 1
资源评论
- 赤君2020-09-03注释挺详细的,pom父工程和依赖的私有包没有,跑不起来,只能自己看代码
- lzdqware2020-09-17代码不全,看起来太麻烦了
BasicLab基础架构实验室
- 粉丝: 12w+
- 资源: 80
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功