前言:
分片,服务器这边怎么处理接收
因为有需求需要对大文件进行切分。
所以了解一下断点续传是什么原理。
以及javaweb 需要怎么进行切分与约束。
需求中切片操作是APP端来进行的切片
1. 接口的定义
文件上传分片
分片可以根据实际上传时间确定,但每块不可以超出200M,最后一块不需要补齐,建议每块不小于10M。
index从1开始,+1递增
参数名称 | 参数类型 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
group | T文本 | 是 |
| 本次提交分组标记(建议使用uuid) |
index | T文本 | 是 |
| 分片序号(1、2、3) |
blockData | 文件 | 是 |
| 文件流 |
因为服务器涉及到多个服务器 负载,
所以文件并不能直接扔到服务器上面,
放到阿里云上面。
最后在拼起来就好了~
MultipartFile file = multipartHttpServletRequest.getFile("blockData");
可以直接转成
file.getInputStream()
Input流文件~
因为之前是APP订单提交的时候进行提取文件中的txt内容来获取到json相关信息。
如果有断点续传之后,就可以进行拼接了。
2. 拼接的实现
提交的时候需要提供:
private String group;// 应该用UUID,来代表单号
private Integer maxIndex;
最大的的index
其实目的是把文件传到OSS
但是从OSS下下来转成OutputStream 然后不断往里面扔数据就好了
private String getLocalFilePath(MultipartFile zipData, OrderSubmitDTO orderSubmitDTO, String localVideoDirectory) throws IOException {
Files.createDirectories(Paths.get(localVideoDirectory));
String localVideoPath = localVideoDirectory + "/" + UuidUtils.getUUID() + ".zip";
if(null == zipData){
OutputStream outputStream = new FileOutputStream(new File(localVideoPath));
for (int i = 1,len = orderSubmitDTO.getMaxIndex()+1; i < len; i++) {
aliOssVideoService.videoDownload(OssProperties.OSS_BASE_PATH + OssProperties.OSS_TEMP_BASE_PATH
+ orderSubmitDTO.getGroup().trim() + "/" + i , outputStream);
}
outputStream.flush();
outputStream.close();
}else {
zipData.transferTo(new File(localVideoPath));
}
return localVideoPath;
}
AliOssServiceImpl
@Override
public void videoDownload(String ossFilePath, OutputStream outputStream) throws IOException {
download(ossFilePath, outputStream);
}
public void download(String ossUrl, OutputStream outputStream) throws IOException {
OSSObject ossObject = OssClientFactory.getOssClient().getObject(ossProperties.getOssBucket(), ossUrl);
InputStream in = ossObject.getObjectContent();
if(null != in){
int i;
byte[] buffer = new byte[1024];
while ((i = in.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
in.close();
}
}
大体思想如下。