Java连接腾讯云COS对象储存实现文件上传接口详细配置 和 Java连接本地redis往期的文章,这篇文章建立在这一篇上。
文件上传的时候将对应进度,将进度保存在redis中,进度监听如果进度变更,则更新redis中的值,前端调用接口访问redis中的进度值,如果为100则断开请求。这里我查了几篇文章但是都不是很全,故而我
@Autowired
private PutObjectProgressListener putObjectProgressListener;
/**
* 记录进度上传
*
* @param file
* @return
*/
@Override
public ResponseDto uploadOSSToll(MultipartFile file) {
ResponseDto responseDto = null;
String originalfileName = file.getOriginalFilename();
//设置文件key
String filePath = getFileKey(originalfileName);
/**
* 这里用带进度条的OSS上传
* 第三个参数是File而不是官网介绍的InputStream,否则获取不到进度
* MultipartFile转File
*/
File f = null;
try {
f = File.createTempFile("tmp", null);
file.transferTo(f);
f.deleteOnExit();
} catch (Exception e) {
e.printStackTrace();
}
// 将对应的值设置到PutObjectProgressListener,
putObjectProgressListener.setKeyRedos(originalfileName,f.length());
// 上传 --> 带进度条上传
cosClient.putObject(new PutObjectRequest(bucketName, originalfileName, f)
.withGeneralProgressListener(putObjectProgressListener));
// 关闭client
cosClient.shutdown();
String url = path + "/" + filePath;
Map<String, String> map = new HashMap<>();
map.put("fileName", originalfileName);
map.put("url", url);
return new ResponseDto(10000, "成功并返回数据", map);
}
putObjectProgressListener 便是进度监控,setKeyRedos方法将对应的值进行初始化
/**
* @author lv.Gui
* @description
* @date 2021/10/25 10:24
**/
@Component
public class PutObjectProgressListener implements ProgressListener {
private long bytesWritten = 0;
private long totalBytes = -1;
private String key = "";
private int percent = 0;
private boolean succeed = false;
@Autowired
private StringRedisTemplate redisTemplate;
public void setKeyRedos(String key, Long size) {
this.totalBytes = size;
this.key = key;
redisTemplate.opsForValue().set(key, String.valueOf(percent));
}
@Override
public void progressChanged(ProgressEvent progressEvent) {
long bytes = progressEvent.getBytes();
ProgressEventType eventType = progressEvent.getEventType();
switch (eventType) {
case TRANSFER_STARTED_EVENT:
break;
case REQUEST_CONTENT_LENGTH_EVENT:
this.totalBytes = bytes;
break;
case REQUEST_BYTE_TRANSFER_EVENT:
this.bytesWritten += bytes;
if (this.totalBytes != -1) {
int percent = (int) (this.bytesWritten * 100.0 / this.totalBytes);
//将进度percent放入redis中
redisTemplate.opsForValue().set(key, String.valueOf(percent));
}
break;
case TRANSFER_COMPLETED_EVENT:
this.succeed = true;
break;
case TRANSFER_FAILED_EVENT:
break;
default:
break;
}
}
}
这里便实现了进度监视。这里设置了文件限制的大小,一般小文件不需要去显示进度表。
#multipart文件限制大小
spring.servlet.multipart.max-file-size=500MB
spring.servlet.multipart.max-request-size=500MB
redis中显示为53
当上传成功之后,redis中的值便是100了。