使用阿里云oss上传文件带进度条显示
Controller层
@ApiOperation(value = "上传文件带进度条")
@PostMapping(value = "uplodeProgressBar")
public R uplodeProgressBar(@RequestParam(value = "file") MultipartFile file, HttpSession session, HttpServletRequest request){
try {
return ossService.uploadOSSToll(file,session,request);
} catch (Exception e) {
e.printStackTrace();
}
return R.failed(OssResultCodeEnum.OSS_SERVER_ERROR);
}
需要自定义监听类
package com.vp.newscp.oss.config;
import com.aliyun.oss.event.ProgressEvent;
import com.aliyun.oss.event.ProgressEventType;
import com.aliyun.oss.event.ProgressListener;
import jdk.nashorn.internal.runtime.logging.Logger;
import javax.servlet.http.HttpSession;
/**
* @description: 自定义监听类,监听文件上传进度
* @date: 2020/12/3 16:17
* @author: xubo
*/
@Logger
public class PutObjectProgressListener implements ProgressListener {
private long bytesWritten = 0;
private long totalBytes = -1;
private boolean succeed = false;
private HttpSession session;
private int percent = 0;
//构造方法中加入session
public PutObjectProgressListener() {
}
public PutObjectProgressListener(HttpSession mSession) {
this.session = mSession;
session.setAttribute("upload_percent", 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放入session中 官网demo中没有放入session这一步
session.setAttribute("upload_percent", percent);
} else {
}
break;
case TRANSFER_COMPLETED_EVENT:
this.succeed = true;
break;
case TRANSFER_FAILED_EVENT:
break;
default:
break;
}
}
public boolean isSucceed() {
return succeed;
}
}
实现类
/**
* 上传私密文件至私有bucket
* 上传至私有bucket的时候 返回key 每次通过key读取文件链接
* 链接有效时间两小时
* Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 2);
* @Param uploadFile 上传文件
* @Param picturePath key
* @author LH_Yu
*/
@Override
public R<HashMap<String, Object>> uploadOSSToll(MultipartFile uploadFile, HttpSession session, HttpServletRequest request) throws Exception {
//返回结果
HashMap<String, Object> map = new HashMap<>();
//定义oss的存储空间
String bucketName = "vp-yun-img";
// ObjectName表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg,不包含存储空间部分
String objectName = "newscp/img/2020-12-01/"+ uploadFile.getOriginalFilename();
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(newscpProperties.getAliyun().getOss().getEndpoint(),
newscpProperties.getAliyun().getOss().getAccessKeyId(),
newscpProperties.getAliyun().getOss().getAccessKeySecret());
//获取本地上传文件路径
String path = request.getParameter("file");
System.out.println("path = " + path);
/**
* 这里用带进度条的OSS上传
* 将session传入PutObjectProgressListener的构造中!官网例子是没有这个操作的
* 注意new PutObjectRequest()的第三个参数是File而不是官网介绍的FileInputStream,否则获取不到进度. 一定切记!!!
*/
try {
// 上传 --> 带进度条上传
ossClient.putObject(new PutObjectRequest(bucketName,objectName,new File("C:\\Users\\Bo\\Desktop\\测试视频.mp4")).withProgressListener(new PutObjectProgressListener(session)));
} catch (Exception e) {
e.printStackTrace();
}
// 关闭client
ossClient.shutdown();
//设置过期时间 -- 两小时
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 2);
//取出文件上传路径
String url = ossClient.generatePresignedUrl(bucketName, objectName, expiration).toString();
map.put("key", objectName);
map.put("url", url);
return R.ok().data(map);
}