Java的minio下载文件实时返回下载进度给前端
时间: 2024-04-04 21:33:09 浏览: 172
【CLI】利用Curl下载文件实时进度条显示的实现
要实现Java的minio下载文件实时返回下载进度给前端,可以通过使用Java SDK提供的ProgressListener接口来实现。
首先,需要创建一个ProgressListener的实现类,在该类中实现progressChanged方法,该方法会在文件下载进度发生变化时被调用,我们可以在该方法中将下载进度返回给前端。
```java
public class DownloadProgressListener implements ProgressListener {
private final HttpServletResponse response;
public DownloadProgressListener(HttpServletResponse response) {
this.response = response;
}
@Override
public void progressChanged(ProgressEvent progressEvent) {
long bytesTransferred = progressEvent.getBytesTransferred();
long totalBytesToTransfer = progressEvent.getTotalBytesToTransfer();
int progress = (int) ((bytesTransferred * 100) / totalBytesToTransfer);
try {
response.getWriter().println("下载进度:" + progress + "%");
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
然后,在进行文件下载时,将创建好的ProgressListener实例传递给GetObjectRequest对象的withProgressListener方法即可。
```java
public void downloadFile(String bucketName, String objectName, HttpServletResponse response) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, InternalException, ErrorResponseException, RegionConflictException {
MinioClient minioClient = new MinioClient("http://minio.example.com", "AccessKey", "SecretKey");
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucketName)
.object(objectName)
.build();
DownloadProgressListener downloadProgressListener = new DownloadProgressListener(response);
getObjectRequest = getObjectRequest.withProgressListener(downloadProgressListener);
minioClient.getObject(getObjectRequest, response.getOutputStream());
}
```
在上述代码中,我们将创建好的DownloadProgressListener实例传递给GetObjectRequest对象的withProgressListener方法,然后使用MinioClient的getObject方法进行文件下载,同时将HttpServletResponse的输出流传递给getObject方法,让文件内容直接写入到响应中,这样前端就能够实时获得下载进度了。
注意:在使用withProgressListener方法时,需要在GetObjectRequest对象创建完成后再调用该方法,否则会抛出NullPointerException异常。
阅读全文