java实现文件分片上传到oss

news/2025/3/15 9:34:59/

controller

   private static  final String PATH="fileUpload/";/*** 功能描述: 初始化* @date 13:53 2023/7/6*/@PostMapping("/initSharding")public AjaxResult testInitControl(@RequestBody ShardingInfoDo param) {ShardingInfoDo result = new ShardingInfoDo();String taskId = UUID.randomUUID().toString().replaceAll("-", "");String taskKey = PATH + taskId + param.getFileName();result.setTaskId(taskId);result.setFileName(param.getFileName());String ossSlicesId = ossUtils.getUploadId(taskKey);result.setOssSlicesId(ossSlicesId);result.setMinSliceSize("100k");redisService.setCacheObject(ossSlicesId, result);return AjaxResult.success(result);}/*** 功能描述: 分片上传* @date 17:17 2023/7/6*/@PostMapping("/uploadShardingFile")public AjaxResult testControl(ShardingInfoDo param, MultipartFile file) throws Exception {//必须求出redis中的PartETags,在分片合成文件中需要以此为依据,合并文件返回最终地址ShardingInfoDo redisParam = redisService.getCacheObject(param.getOssSlicesId());if (redisParam != null){param.setPartETags(redisParam.getPartETags());}param.setSliceNo(param.getSliceNo()+1);int sliceNo = param.getSliceNo();int fileSlicesNum = param.getFileSlicesNum();String ossSlicesId = param.getOssSlicesId();InputStream inputStream = file.getInputStream();Map<Integer, PartETag> partETags = param.getPartETags();//分片上传try{//每次上传分片之后,OSS的返回结果会包含一个PartETagPartETag partETag = ossUtils.partUploadFile(PATH + param.getTaskId() + param.getFileName(), inputStream, ossSlicesId, param.getFileMD5(), param.getSliceNo(), file.getSize());partETags.put(param.getSliceNo(), partETag);//分片编号等于总片数的时候合并文件,如果符合条件则合并文件,否则继续等待if (fileSlicesNum == sliceNo){//合并文件,注意:partETags必须是所有分片的所以必须存入redis,然后取出放入集合String url = ossUtils.completePartUploadFile(PATH + param.getTaskId() + param.getFileName(), ossSlicesId, new ArrayList<>(partETags.values()));//oss地址返回后存入并清除redisparam.setFileUrl(url);redisService.deleteObject(ossSlicesId);return AjaxResult.success(param);} else{redisService.setCacheObject(param.getOssSlicesId(), param);}} catch (Exception e){e.printStackTrace();throw new Exception("上传异常");}return AjaxResult.success();}

工具类

package com.ruoyi.common.utils;import com.aliyun.oss.*;
import com.aliyun.oss.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.util.List;/*** @Auther: ZHANG PU* @Date: 2023/7/6 13:17* @Description:*/
@Component
public class OssUtils {private static Logger logger = LoggerFactory.getLogger(OssUtils.class);@Value("${oss.endpoint}")private String endpoint;@Value("${oss.accessKeyId}")private String accessKeyId;@Value("${oss.accessKeySecret}")private String accessKeySecret;@Value("${oss.bucketName}")private String bucketName;private OSS ossClient;@PostConstructpublic void init() {ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);}/*** 分块上传完成获取结果*/public String completePartUploadFile(String fileKey, String uploadId, List<PartETag> partETags) {CompleteMultipartUploadRequest request = new CompleteMultipartUploadRequest(bucketName, fileKey, uploadId, partETags);CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(request);String downLoadUrl = getDownloadUrl(fileKey, bucketName);return downLoadUrl;}/*** @param fileKey  文件名称* @param is       文件流数据* @param uploadId oss唯一分片id* @param fileMd5  文件的md5值(非必传)* @param partNum  第几片* @param partSize 总片数* @return*/public PartETag partUploadFile(String fileKey, InputStream is, String uploadId, String fileMd5, int partNum, long partSize) {UploadPartRequest uploadPartRequest = new UploadPartRequest();uploadPartRequest.setBucketName(bucketName);uploadPartRequest.setUploadId(uploadId);uploadPartRequest.setPartNumber(partNum);uploadPartRequest.setPartSize(partSize);uploadPartRequest.setInputStream(is);uploadPartRequest.setKey(fileKey);uploadPartRequest.setMd5Digest(fileMd5);UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);return uploadPartResult.getPartETag();}/*** 分块上传完成获取结果*/public String getUploadId(String fileKey) {InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileKey);// 初始化分片InitiateMultipartUploadResult unrest = ossClient.initiateMultipartUpload(request);// 返回uploadId,它是分片上传事件的唯一标识,您可以根据这个ID来发起相关的操作,如取消分片上传、查询分片上传等。String uploadId = unrest.getUploadId();return uploadId;}/*** 获取bucket文件的下载链接** @param pathFile   首字母不带/的路径和文件* @param bucketName* @return 上报返回null, 成功返回地址*/public String getDownloadUrl(String pathFile, String bucketName) {StringBuffer url = new StringBuffer();url.append(endpoint).append("/");if (pathFile != null && !"".equals(pathFile)){url.append(pathFile);}return url.toString().replace("https://", "https://" + bucketName + ".");}
}
文章来源:https://blog.csdn.net/weixin_42456784/article/details/131700260
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/853974.html

相关文章

怎么改变ens33的IP地址

命令&#xff1a; sudo ifconfig ens33 192.168.31.160

注册表修改IP地址和DNS等信息

---------------------win8系统 1. 2. 3. ------------------------------------------------------------------------------------------------------------------------------------------------ ----------其他系统 注册表里修改IP地址 原来的集成网卡损坏&#xff0c;而换…

(亲测可用)修改VisualSVN Server地址为ip地址,修改svn服务端地址为ip或者域名地址的方法

svn服务端搭建成功之后&#xff0c;地址太长很麻烦&#xff0c;想搞一个服务器专门做svn服务端&#xff0c;修改svn地址为ip地址 无奈网上教程不靠谱&#xff0c;于是自己研究了下 1.修改VisualSVN 的地址 2修改地址并保存 很多人不成功就在这里&#xff0c;点击确认之后复制…

windows命令行修改IP地址和dns服务器地址

因为以太网属性为空白&#xff0c;修改不了IP了又不想重装系统只能使用命令的方式进行临时解决了 以管理员的身份运行cmd&#xff0c;使用命令的方式进行修改IP和DNS服务器 修改IP地址&#xff1a; netsh interface ip set address “以太网 3” static 192.168.200.130 255.…

win10修改dns服务器地址,教你Win10如何更改首选DNS服务器地址

Win10首选DNS服务器地址 DNS(Domain Name Server&#xff0c;域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器&#xff0c;这是专业性的表述&#xff0c;简单来说就是如果DNS出现问题&#xff0c;就会导致电脑可以上QQ&#xff0c;但是不能够…

电脑配置ip--host修改ip地址然后刷新操作-win10

目录 windows修改配置 C:\Windows\System32\drivers\etc\hosts 修改 在各种工作场景中我们经常遇到的情况需要修改本地window的配置ip地址&#xff0c;这样才能进行正常的内网访问&#xff0c;所以咯需要修改本地ip&#xff0c;只有这样我们才能正常访问应用部署的服务器&a…

QC11服务器IP地址变更修改数据库配置文件

公司IP地址大变更&#xff0c;导致原来的QC11无法访问&#xff0c;修改配置文件和数据库&#xff0c;就可以使用新IP访问了QC了&#xff01; 1、修改配置文件&#xff0c;修改WEB-INF下的siteadmin.xml文件&#xff0c;这里需要特别注意&#xff0c;不是在安装程序C:\Program F…

pve修改ip地址

一、在局域网的电脑浏览器输入PVE的IP地址登录后台&#xff0c;从左边的菜单找到“PVE”—“_Shell”菜单&#xff0c;进入网页版的ssh界面下&#xff1b;或者在主机的控制台下输入root密码后登录到ssh下&#xff1b; 二、输入以下命令回车&#xff1a; vi /etc/network/inte…