目录
1:业务流程
步骤一:前端进入上传图片的界面
步骤二:上传图片,请求到后端的媒资管理服务模块
步骤三:媒资管理服务将图片文件存储到minio
步骤四:媒资管理服务记录文件信息保存到数据库
2:接口实现
controller层
消费者声明:媒体类型用于声明随之而来的数据的格式
创建了封装参数类:用来封装相关的参数信息
声明文件类型固定数字声明,文件大小,创建临时文件将接收到的文件拷贝到临时文件中获取临时文件的在本地的绝对路径
@RequestMapping(value = "/upload/coursefile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public UploadFileResultDto upload(@RequestPart("filedata") MultipartFile filedata) throws IOException {
Long companyId = 1232141425L;
UploadFileParamsDto uploadFileParamsDto = new UploadFileParamsDto();
//图片
uploadFileParamsDto.setFileType("001001");
//文件名称
uploadFileParamsDto.setFilename(filedata.getOriginalFilename());//文件名称
//文件大小
long fileSize = filedata.getSize();
uploadFileParamsDto.setFileSize(fileSize);
//创建临时文件
File tempFile = File.createTempFile("minio", "temp");
//上传的文件拷贝到临时文件
filedata.transferTo(tempFile);
//文件路径
String absolutePath = tempFile.getAbsolutePath();
//上传文件
UploadFileResultDto uploadFileResultDto = mediaFilesService.uploadFile(companyId, uploadFileParamsDto, absolutePath);
return uploadFileResultDto;
}
service层
接口:
UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto,String localFilePath);
实现类:
获取文件名称取到后缀类型获取到文件类型,生成存储minio里面的文件目录,通过文件的流生成MD5值(便于后期校验文件是否完整),拼接完整minio存储路径(存储到minio中具体的目录和md5值作为文件名称和后缀信息),调用添加文件的方法(路径,媒资类型,存储的桶,桶的文件目录),将上传的媒资信息存储到mysql表中(参数,媒资文件在minio的存储位置,文件类型,名称,md5值作为唯一标识)使用代理对象进行调用事务方法,非事务方法调用事务方法事务会失效无法回滚。
@Override
public UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, String localFilePath) {
//获取到文件名称
String filename = uploadFileParamsDto.getFilename();
//获取文件后缀类型
String extension = filename.substring(filename.lastIndexOf("."));
//得到mimeType
String mimeType = getMimeType(extension);
//获取当前时间
String folderPath = getDefaultFolderPath();
File file = new File(localFilePath);
if (!file.exists()) {
XueChengPlusException.cast("文件不存在");
}
//获取文件的md5值
String fileMd5 = getFileMd5(file);
//得到ObjectName
String ObjectName = folderPath+fileMd5+extension;
//上传文件
boolean flag = addMediaFilesToMinIO(localFilePath, mimeType, BUCKET_FILES, ObjectName);
if (!flag){
XueChengPlusException.cast("上传文件失败");
}
//文件大小
uploadFileParamsDto.setFileSize(file.length());
//将文件信息存储到数据库
MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto,BUCKET_FILES,ObjectName);
//准备返回数据
UploadFileResultDto uploadFileResultDto = new UploadFileResultDto();
BeanUtils.copyProperties(mediaFiles, uploadFileResultDto);
return uploadFileResultDto;
}
抽取拓展名方法:
/**
* 抽取扩展名
* @param extension
* @return
*/
private String getMimeType(String extension){
if(extension==null) {
extension = "";
}
//根据扩展名取出mimeType
ContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(extension);
//通用mimeType,字节流
String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
if(extensionMatch!=null){
mimeType = extensionMatch.getMimeType();
}
return mimeType;
}
获取当前时间点抽取方法(存储文件的路径):
//获取文件默认存储目录路径 年/月/日
private String getDefaultFolderPath() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String folder = sdf.format(new Date()).replace("-", "/")+"/";
return folder;
}
抽取添加的文件方法:
/**
* @description 将文件写入minIO
* @param localFilePath 文件地址
* @param bucket 桶
* @param objectName 对象名称
*/
public boolean addMediaFilesToMinIO(String localFilePath,String mimeType,String bucket, String objectName) {
try {
UploadObjectArgs testbucket = UploadObjectArgs.builder()
.bucket(bucket)
.object(objectName)
.filename(localFilePath)
.contentType(mimeType)
.build();
minioClient.uploadObject(testbucket);
log.debug("上传文件到minio成功,bucket:{},objectName:{}",bucket,objectName);
System.out.println("上传成功");
return true;
} catch (Exception e) {
e.printStackTrace();
log.error("上传文件到minio出错,bucket:{},objectName:{},错误原因:{}",bucket,objectName,e.getMessage(),e);
XueChengPlusException.cast("上传文件到文件系统失败");
}
return false;
}
添加文件信息到mysql中记录相关信息
调用处理任务的方法中(在等待处理的方法中如果上传的文件类型是视频类型,保存媒资信息到待处理的任务表中)。
/**
* @description 将文件信息添加到文件表
* @param companyId 机构id
* @param fileMd5 文件md5值
* @param uploadFileParamsDto 上传文件的信息
* @param bucket 桶
* @param objectName 对象名称
*/
@Transactional
public MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName){
//从数据库查询文件
MediaFiles mediaFiles = baseMapper.selectById(fileMd5);
if (mediaFiles == null) {
mediaFiles = new MediaFiles();
//拷贝基本信息
BeanUtils.copyProperties(uploadFileParamsDto, mediaFiles);
mediaFiles.setId(fileMd5);
mediaFiles.setFileId(fileMd5);
mediaFiles.setCompanyId(companyId);
mediaFiles.setUrl("/" + bucket + "/" + objectName);
mediaFiles.setBucket(bucket);
mediaFiles.setFilePath(objectName);
mediaFiles.setCreateDate(LocalDateTime.now());
//审核通过
mediaFiles.setAuditStatus("002003");
mediaFiles.setStatus("1");
//保存文件信息到文件表
int insert = baseMapper.insert(mediaFiles);
if (insert < 0) {
log.error("保存文件信息到数据库失败,{}",mediaFiles.toString());
XueChengPlusException.cast("保存文件信息失败");
}
//添加到待处理任务表中
addWaitingTask(mediaFiles);
log.debug("保存文件信息到数据库成功,{}",mediaFiles.toString());
}
return mediaFiles;
}