6.3.3.5 after-send-file
在所有分块上传完成后触发,可以请求服务端合并分块文件
参考代码如下:
[AppleScript] 纯文本查看 复制代码 type:"POST",
url:"/api/media/upload/mergechunks", data:{
fileMd5:this.fileMd5,
fileName: file.name,
fileSize:file.size,
mimetype:file.type,
fileExt:file.ext }
6.3.3.6 页面效果
6.3.4 Api接口
定义文件上传的Api接口,此接收是前端WebUploader调用服务端的接口。 编写此接口需要参数前端WebUploader应用代码。
[AppleScript] 纯文本查看 复制代码 Api(value = "媒资管理接口",description = "媒资管理接口,提供文件上传,文件处理等接口") public interface MediaUploadControllerApi {
@ApiOperation("文件上传注册")
public ResponseResult register(String fileMd5,
String fileName,
Long fileSize,
String mimetype,
String fileExt);
@ApiOperation("分块检查")
public CheckChunkResult checkchunk(String fileMd5,
Integer chunk,
Integer chunkSize);
@ApiOperation("上传分块")
public ResponseResult uploadchunk(MultipartFile file,
Integer chunk,
String fileMd5);
@ApiOperation("合并文件")
public ResponseResult mergechunks(String fileMd5,
String fileName,
Long fileSize,
String mimetype,
String fileExt);
6.3.5媒资服务端编写
6.3.5.1 业务流程
服务端需要实现如下功能:
1、上传前检查上传环境
检查文件是否上传,已上传则直接返回。
检查文件上传路径是否存在,不存在则创建。
2、分块检查 检查分块文件是否上传,已上传则返回true。
未上传则检查上传路径是否存在,不存在则创建。
3、分块上传
将分块文件上传到指定的路径。
4、合并分块
将所有分块文件合并为一个文件。
在数据库记录文件信息。
6.3.5.2 上传注册
由于上传过程复杂,开发时按业务流程分别实现。
1、配置 application.yml配置上传文件的路径:
[AppleScript] 纯文本查看 复制代码 xc‐service‐manage‐media:
upload‐location: F:/develop/video/
2、定义Dao 媒资文件管理Dao
[AppleScript] 纯文本查看 复制代码 public interface MediaFileRepository extends MongoRepository<MediaFile,String> {
}
3、Service
功能:
1)检查上传文件是否存在
2)创建文件目录
[AppleScript] 纯文本查看 复制代码 @Service public class MediaUploadService {
private final static Logger LOGGER = LoggerFactory.getLogger(MediaUploadController.class);
@Autowired
MediaFileRepository mediaFileRepository;
//上传文件根目录
@Value("${xc‐service‐manage‐media.upload‐location}") String uploadPath;
/**
* 根据文件md5得到文件路径
* 规则:
* 一级目录:md5的第一个字符
* 二级目录:md5的第二个字符
* 三级目录:md5
* 文件名:md5+文件扩展名
* @param fileMd5 文件md5值
* @param fileExt 文件扩展名
* @return 文件路径
*/
private String getFilePath(String fileMd5,String fileExt){
String filePath = uploadPath+fileMd5.substring(0, 1) + "/" + fileMd5.substring(1, 2) + "/" + fileMd5 + "/" + fileMd5 + "." + fileExt;
return filePath;
}
//得到文件目录相对路径,路径中去掉根目录
private String getFileFolderRelativePath(String fileMd5,String fileExt){
String filePath = fileMd5.substring(0, 1) + "/" + fileMd5.substring(1, 2) + "/" + fileMd5 + "/";
return filePath;
}
//得到文件所在目录
private String getFileFolderPath(String fileMd5){
String fileFolderPath = uploadPath+ fileMd5.substring(0, 1) + "/" + fileMd5.substring(1, 2) + "/" + fileMd5 + "/" ;
return fileFolderPath;
}
//创建文件目录
private boolean createFileFold(String fileMd5){
//创建上传文件目录
String fileFolderPath = getFileFolderPath(fileMd5);
File fileFolder = new File(fileFolderPath);
if (!fileFolder.exists()) {
//创建文件夹
boolean mkdirs = fileFolder.mkdirs();
return mkdirs;
}
return true;
}
//文件上传注册 public ResponseResult register(String fileMd5, String fileName, String fileSize, String mimetype, String fileExt) {
//检查文件是否上传
//1、得到文件的路径
String filePath = getFilePath(fileMd5, fileExt);
File file = new File(filePath);
//2、查询数据库文件是否存在
Optional<MediaFile> optional = mediaFileRepository.findById(fileMd5);
//文件存在直接返回
if(file.exists() && optional.isPresent()){
ExceptionCast.cast(MediaCode.UPLOAD_FILE_REGISTER_EXIST);
} boolean fileFold = createFileFold(fileMd5);
if(!fileFold){
//上传文件目录创建失败
ExceptionCast.cast(MediaCode.UPLOAD_FILE_REGISTER_CREATEFOLDER_FAIL);
}
return new ResponseResult(CommonCode.SUCCESS);
}
}
|