Java分片上传全解决方案,真香

95 篇文章 15 订阅 ¥199.90 ¥99.00

因为我们是做语音识别的,在离线的情况下,需要上传语音,但是因为语音很大,

所以需要拆分进行上传,要不然如果网络波动就前功尽弃了,今天就来复述下这个方案

1、解决方案

我们的方案是

第一步需要创建转写任务,返回给前段一个taskId。

第二步就是分片上传语音,每次只能上传一片语音,并且是顺序上传。

在最后一片上传完成后进行合成并且执行任务。如果失败了下次继续上传就可以了

2、show code

看一下我们分片上传的时候一些请求参数。

主要的参数有两个。

一个是sliceIndex,表示当前是第几个分片

一个是sliceTotal,表示总共有多少个分片,在最后一个的时候触发合并任务。

/**
 * 产品id 必传
 */
private String productId;
/**
 * 任务Id
 */
private String taskId;
/**
 * 文件名
 */
private String fileName;
/**
 * 当前分片的索引 从 1 开始
 */
private Integer sliceIndex;
/**
 * 总共多少片 最后一个会触发合并任务
 */
private Integer sliceTotal;

下面是合并文件的代码:

/**
 * 合并文件夹下的文件
 *
 * @param fold 所在文件夹
 * @pa
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是Java SpringBoot框架下实现OSS文件分片上传和进度条展示的示例代码: 1. 首先在pom.xml文件中引入OSS SDK依赖: ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.9.2</version> </dependency> ``` 2. 创建一个名为OSSUtil的工具类,用于连接OSS服务并实现分片上传和进度查询: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; @Component public class OSSUtil { // 阿里云OSS服务的Endpoint private static final String ENDPOINT = "your_endpoint"; // 阿里云OSS服务的AccessKeyId private static final String ACCESS_KEY_ID = "your_access_key_id"; // 阿里云OSS服务的AccessKeySecret private static final String ACCESS_KEY_SECRET = "your_access_key_secret"; // 阿里云OSS服务的BucketName private static final String BUCKET_NAME = "your_bucket_name"; // OSS客户端实例 private OSS ossClient; // 初始化OSS客户端 public void init() { ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); } // 关闭OSS客户端 public void close() { ossClient.shutdown(); } // 分片上传文件 public void multipartUpload(String objectName, InputStream inputStream, long fileSize) throws IOException { // 初始化MultipartUploadRequest InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(BUCKET_NAME, objectName); InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request); // 获取UploadId String uploadId = result.getUploadId(); // 设置每个Part的大小,最小为100KB final long partSize = 1024 * 100L; // 计算文件的Part个数 int partCount = (int) (fileSize / partSize); if (fileSize % partSize != 0) { partCount++; } List<PartETag> partETags = new ArrayList<>(); for (int i = 0; i < partCount; i++) { long startPos = i * partSize; long curPartSize = Math.min(partSize, fileSize - startPos); InputStream partInputStream = new FilePartInputStream(inputStream, startPos, curPartSize); UploadPartRequest uploadPartRequest = new UploadPartRequest(); uploadPartRequest.setBucketName(BUCKET_NAME); uploadPartRequest.setKey(objectName); uploadPartRequest.setUploadId(uploadId); uploadPartRequest.setPartNumber(i + 1); uploadPartRequest.setInputStream(partInputStream); uploadPartRequest.setPartSize(curPartSize); UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest); partETags.add(uploadPartResult.getPartETag()); } // 完成分片上传 CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(BUCKET_NAME, objectName, uploadId, partETags); ossClient.completeMultipartUpload(completeMultipartUploadRequest); } // 获取文件上传进度 public long getUploadProgress(String objectName) { // 获取文件大小 ObjectMetadata metadata = ossClient.getObjectMetadata(BUCKET_NAME, objectName); long fileSize = metadata.getContentLength(); // 获取已上传的Part信息 ListPartsRequest listPartsRequest = new ListPartsRequest(BUCKET_NAME, objectName, null); PartListing partListing = ossClient.listParts(listPartsRequest); List<PartSummary> partSummaries = partListing.getParts(); // 计算已上传的大小 long uploadedSize = 0; for (PartSummary partSummary : partSummaries) { uploadedSize += partSummary.getSize(); } // 计算上传进度 long progress = (long) ((double) uploadedSize / fileSize * 100); return progress; } // 自定义的输入流,用于分片上传文件 private static class FilePartInputStream extends InputStream { private InputStream inputStream; private long startPos; private long curPartSize; private long pos; public FilePartInputStream(InputStream inputStream, long startPos, long curPartSize) { this.inputStream = inputStream; this.startPos = startPos; this.curPartSize = curPartSize; this.pos = 0; } @Override public int read() throws IOException { if (pos >= curPartSize) { return -1; } int read = inputStream.read(); pos++; return read; } @Override public int read(byte[] b, int off, int len) throws IOException { if (pos >= curPartSize) { return -1; } int readLen = (int) Math.min(len, curPartSize - pos); int read = inputStream.read(b, off, readLen); pos += read; return read; } @Override public void close() throws IOException { super.close(); inputStream.close(); } } } ``` 3. 创建一个名为UploadController的控制器,用于处理文件上传和进度查询请求: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @RestController @RequestMapping("/upload") public class UploadController { @Autowired private OSSUtil ossUtil; // 处理文件上传请求 @PostMapping("/file") public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { // 初始化OSS客户端 ossUtil.init(); // 分片上传文件 String objectName = file.getOriginalFilename(); ossUtil.multipartUpload(objectName, file.getInputStream(), file.getSize()); // 关闭OSS客户端 ossUtil.close(); return "success"; } // 处理进度查询请求 @GetMapping("/progress") public long getUploadProgress(@RequestParam("objectName") String objectName) { // 获取上传进度 long progress = ossUtil.getUploadProgress(objectName); return progress; } } ``` 4. 在前端页面中使用HTML5的进度条组件,结合后端实现的上传进度查询接口,展示文件上传的进度。例如,以下是一个基于Vue.js的示例代码: ```html <template> <div> <input type="file" @change="handleFileChange"> <button @click="uploadFile">上传</button> <div v-show="showProgress"> <progress :value="progress" max="100"></progress> <span>{{ progress }}%</span> </div> </div> </template> <script> export default { data() { return { file: null, showProgress: false, progress: 0, intervalId: null } }, methods: { handleFileChange(event) { this.file = event.target.files[0] }, uploadFile() { this.showProgress = true let formData = new FormData() formData.append('file', this.file) axios.post('/upload/file', formData) .then(response => { console.log(response) }) .catch(error => { console.log(error) }) this.intervalId = setInterval(() => { axios.get('/upload/progress', { params: { objectName: this.file.name }}) .then(response => { this.progress = response.data if (this.progress >= 100) { clearInterval(this.intervalId) } }) .catch(error => { console.log(error) }) }, 1000) } } } </script> ``` 以上就是Java SpringBoot框架下实现OSS文件分片上传和进度条展示的代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香菜+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值