java springboot oss 断点上传 进度条
时间: 2023-06-28 13:15:59 浏览: 173
好的,以下是使用 Spring Boot 和阿里云 OSS Java SDK 实现断点上传并显示上传进度的示例代码:
```java
import com.aliyun.oss.*;
import com.aliyun.oss.model.UploadFileRequest;
import com.aliyun.oss.model.UploadFileResult;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class OSSService {
// 阿里云 OSS 客户端
private final OSS ossClient;
// 构造函数注入 OSS 客户端对象
@Autowired
public OSSService(OSS ossClient) {
this.ossClient = ossClient;
}
/**
* 断点上传文件到 OSS
*
* @param file 要上传的文件
* @param bucket 存储空间名称
* @param object 存储对象名称
* @param progress 上传进度回调函数
* @throws IOException
*/
public void uploadFileToOSS(MultipartFile file, String bucket, String object, ProgressCallback progress) throws IOException {
// 创建 UploadFileRequest 对象
UploadFileRequest uploadFileRequest = new UploadFileRequest(bucket, object);
// 设置要上传的文件
File localFile = File.createTempFile("temp", null);
file.transferTo(localFile);
uploadFileRequest.setUploadFile(localFile.getAbsolutePath());
// 创建 ResumableUploader 对象
ResumableUploader uploader = new ResumableUploader(ossClient, uploadFileRequest);
// 设置上传进度回调函数
uploader.setProgressCallback(progress);
// 开始上传文件
UploadFileResult result = uploader.upload();
// 删除本地临时文件
localFile.delete();
// 打印上传结果
System.out.println("ETag: " + result.getETag());
System.out.println("RequestId: " + result.getRequestId());
}
}
```
在上述代码中,我们定义了一个名为 `uploadFileToOSS` 的方法,该方法接收要上传的文件、存储空间名称、存储对象名称和上传进度回调函数作为参数。在方法内部,我们首先创建 `UploadFileRequest` 对象,并设置要上传的文件。然后,我们创建 `ResumableUploader` 对象,并设置上传进度回调函数。最后,我们调用 `upload` 方法开始上传文件。
上传进度回调函数的实现如下:
```java
import com.aliyun.oss.event.ProgressEvent;
import com.aliyun.oss.event.ProgressEventType;
import com.aliyun.oss.event.ProgressListener;
public class OSSProgressCallback implements ProgressListener {
private final long totalSize;
public OSSProgressCallback(long totalSize) {
this.totalSize = totalSize;
}
@Override
public void progressChanged(ProgressEvent event) {
if (event.getEventType() == ProgressEventType.REQUEST_BYTE_TRANSFER_EVENT) {
long bytesWritten = event.getBytes();
System.out.println("Uploaded " + bytesWritten + " bytes of " + totalSize + " bytes");
}
}
}
```
在上述代码中,我们定义了一个名为 `OSSProgressCallback` 的类,该类实现了 `ProgressListener` 接口。在 `progressChanged` 方法中,我们判断事件类型是否为 `REQUEST_BYTE_TRANSFER_EVENT`,如果是,则表示已上传的字节数发生了变化,我们就可以计算出当前上传进度并输出。
在 Spring Boot 控制器中调用 `uploadFileToOSS` 方法,并传入上传进度回调函数:
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
public class OSSController {
private final OSSService ossService;
@Autowired
public OSSController(OSSService ossService) {
this.ossService = ossService;
}
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
String bucketName = "<yourBucketName>";
String objectName = "<yourObjectName>";
// 计算文件大小
long fileSize = file.getSize();
// 创建上传进度回调函数
ProgressCallback progressCallback = new OSSProgressCallback(fileSize);
// 上传文件到 OSS
ossService.uploadFileToOSS(file, bucketName, objectName, progressCallback);
return "File uploaded successfully!";
}
}
```
需要注意的是,这里需要先注入一个阿里云 OSS 客户端对象,示例代码中使用了构造函数注入的方式。另外,需要替换代码中的 `bucketName` 和 `objectName` 参数为自己阿里云账号的信息。
阅读全文