eturn
*/
@Override
protected R<File> merge(List<java.io.File> files, String fileName, FileChunksMergeDTO fileChunksMergeDTO) throws Exception {
MinioAutoConfigure.this.buildClient(fileServerProperties);
Vector<InputStream> streams = new Vector<>();
//分片合并成功,需要封装File对象相关属性
File fileResult = new File();
for (java.io.File file : files) {//file对应的就是分片文件
streams.add(new FileInputStream(file));
new FileInputStream(file).available();
//删除当前分片
file.delete();
}
//生成满足要求的objectName和url
String objectName = doReName(fileName, fileResult);
//sequenceInputStream直接使用只能获取第一个分片的数据,故先全部转成输出流再转成输入流
//存在问题:
//1.本身这个实现就不优雅
//2.OutOfMemoryError: Java heap space,测试同时传三个几百M的文件会发生内存溢出
//目前是分片文件上传到服务器,再程序里合并后再上传到minio,下面提供了很多minio的工具类,可以改成分片文件上传到minio,利用minioClient合并文件,目前未实现
try (SequenceInputStream sequenceInputStream = new SequenceInputStream(streams.elements());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
byte[] bytes = new byte[sequenceInputStream.available()];
int len;
while ((len = sequenceInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
byte[] outBytes = outputStream.toByteArray();
ByteBuffer buffer = ByteBuffer.wrap(outBytes);
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer.array())) {
// 使用putObject上传一个文件到存储桶中
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.contentType(fileChunksMergeDTO.getContextType())
.stream(inputStream, inputStream.available(), ObjectWriteArgs.MIN_MULTIPART_SIZE).build();
minioClient.putObject(putObjectArgs);
} catch (Exception ex) {
log.error("分片文件合并失败");
return R.fail("分片文件合并失败");
}
} catch (Exception ex) {
log.error("分片文件合并失败");
return R.fail("分片文件合并失败");
}
return R.success(fileResult);
}
}
5.11.7 分片合并接口
接口文档:
在FileChunkController中提供分片合并方法,直接调用分片处理策略类完成分片合并操作:
@Autowired
private FileChunkStrategy fileChunkStrategy;//分片文件处理策略
/**
* 分片合并
* @param info
* @return
*/
@ApiOperation(value = "分片合并", notes = "所有分片上传成功后,调用该接口对分片进行合并")
@PostMapping(value = "/merge")
public R<File> saveChunksMerge(FileChunksMergeDTO info) {
log.info("info={}", info);
return fileChunkStrategy.chunksMerge(info);
}
第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令
第2-1-3章 docker-compose安装FastDFS,实现文件存储服务
第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio-minio全网最全的资料
全套代码及资料全部完整提供,点此处下载