Java OOS 简单上传,分片上传(加进度条),(流式)下载文件
时间:2022-11-16 13:30:00
1.下载前端调用接口 (流式下载大文件可能比较慢!也可以直接下载URL的方式)
@GetMapping(value = "/downloadFile") public void downloadFile(@RequestParam String ossPath, HttpServletResponse response) { BufferedInputStream input; OutputStream outputStream; OSS ossClient = OssUtil.getOssBean(); try { OSSObject ossObject = ossClient.getObject(OssUtil.BUCKET_NAME, ossPath); // response.reset(); response.setCharacterEncoding("utf-8"); response.setContentType("application/x-msdownload"); response.addHeader("Content-Disposition", "attachment;fileName=\"" new String(ossPath.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8) "\""); // "attachment;filename=" new String(ossPath.getBytes("gb2312"), "ISO8859-1")); input = new BufferedInputStream(ossObject.getObjectContent()); byte[] buffBytes = new byte[1024]; outputStream = response.getOutputStream(); int read; while ((read = input.read(buffBytes)) != -1) { outputStream.write(buffBytes, 0, read); } outputStream.flush(); // 读取数据后,必须关闭获取的流量,否则会造成连接泄漏,导致要求无连接可用,程序无法正常工作。 ossObject.close(); } catch (OSSException | ClientException | IOException oe) { oe.printStackTrace(); } finally { if (ossClient != null) { ossClient.shutdown(); } } }
2.简单上传接口,官方可以上传进度条api实现,这块不做实现。
@PassToken @ApiOperation("简单上传") @PostMapping(value = "/uploadFile") public RestResult
3.分片上传,官方分片上传不支持进度条,我用这个redis实现,也可用session
@PassToken @PostMapping(value = "/multipartUpload") public RestResult
4,工具类Ossutil
@Slf4j
public class OssUtil {
public static final String STYLE = "imm/previewdoc,copy_1";
/**
* 查看自己的节点
* (接口调用的话)内网上传 oss地址
*/
public static final String INNER_ENDPOINT = "https://oss-cn-beijing-internal.aliyuncs.com";
/**
* 查看自己的节点
* (接口调用的话)外网下载或预览 oss地址 oss-cn-beijing.aliyuncs.com
*/
public static final String OUT_ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";
public static final String KEY_ID = "你自己的";
public static final String KEY_SECRET = "你自己的";
public static final String BUCKET_NAME = "你自己的";
public static void delOssFile(String fileName) {
if (fileName.isEmpty()){
return;
}
OSS oss = new OSSClientBuilder().build(OUT_ENDPOINT, KEY_ID, KEY_SECRET);
oss.deleteObject(BUCKET_NAME, fileName);
oss.shutdown();
}
public static void delOssFile(String ossPreviewName,String ossDownloadName) {
if (ossPreviewName.isEmpty()||ossDownloadName.isEmpty()){
return;
}
OSS oss = new OSSClientBuilder().build(OUT_ENDPOINT, KEY_ID, KEY_SECRET);
oss.deleteObject(BUCKET_NAME, ossPreviewName);
oss.shutdown();
}
public static OSS getOssBeanInner(){
return new OSSClientBuilder().build(INNER_ENDPOINT, KEY_ID, KEY_SECRET);
}
public static OSS getOssBeanOut(){
return new OSSClientBuilder().build(OUT_ENDPOINT, KEY_ID, KEY_SECRET);
}
public static class PutObjectProgressListener implements ProgressListener {
private HttpSession session;
private long bytesWritten = 0;
private long totalBytes = -1;
private boolean succeed = false;
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:
log.info("Start to upload......");
break;
case REQUEST_CONTENT_LENGTH_EVENT:
this.totalBytes = bytes;
log.info(this.totalBytes + " bytes in total will be uploaded to OSS");
break;
case REQUEST_BYTE_TRANSFER_EVENT:
this.bytesWritten += bytes;
if (this.totalBytes != -1) {
percent = (int) (this.bytesWritten * 100.0 / this.totalBytes);
//将进度percent放入session中
session.setAttribute("upload_percent", percent);
log.info(bytes + " bytes have been written at this time, upload progress: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
} else {
log.info(bytes + " bytes have been written at this time, upload ratio: unknown" + "(" + this.bytesWritten + "/...)");
}
break;
case TRANSFER_COMPLETED_EVENT:
this.succeed = true;
log.info("Succeed to upload, " + this.bytesWritten + " bytes have been transferred in total");
break;
case TRANSFER_FAILED_EVENT:
log.info("Failed to upload, " + this.bytesWritten + " bytes have been transferred");
break;
default:
break;
}
}
public boolean isSucceed() {
return succeed;
}
}
}