1 OSS多种上传方案如下图官网地址https://help.aliyun.com/zh/oss/user-guide/object-overview?spma2c4g.11186623.help-menu-31815.d_0_3_0.159e7dc0FoaPTQ2 OSS云服务的初始配置2.1 购买云存储服务2.2 新增oss Bucket存储空间 并配置新增存储空间检查存储空间配置 可以在左侧权限控制里面修改配置管理2.3 创建AccessKeyId以及AccessSecret2.3.1创建用户2.3.2记住用户ID和密钥3 服务端直接上传上传测试官方文档 https://github.com/alibaba/aliyun-spring-boot/blob/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sample/README-zh.md3.1 引入依赖dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alicloud-oss/artifactIdversion2.2.0.RELEASE/version/dependency3.2 将用户ID和密钥配置到springboot的yml文件中spring:alicloud:access-key:# 2.3.2中用户idsecret-key:# 2.3.2中用户keyoss:endpoint:#oss-cn-beijing.aliyuncs.com # 2.2中检查配置最下面可以查阅到Endpoint地域节点bucket:# gulimall-hellolpf # 2.2中创建的Bucket名字3.3 测试用例SpringBootTestclassGulimallThirdPartyApplicationTests{AutowiredOSSossClient;TestvoidcontextLoads()throwsFileNotFoundException{FileInputStreaminputStreamnewFileInputStream(C:\\Users\\24861\\Pictures\\Screenshots\\屏幕截图 2026-09-12 233720.png);ossClient.putObject(gulimall-hellolpf,屏幕截图 2026-09-12 233720.pngg,inputStream);ossClient.shutdown();System.out.println(上传成功);}}3.4 上传成功4 web表单上传方案谷粒商城的实现方式官方 官方参考文档使用PostObject接口将文件直接从 Web 端上传到 OSS服务器生成的签名为直传操作提供安全保障同时支持配置上传策略Policy以限制上传操作并满足业务需求。即java服务端根据2.3.2的密钥对postPolicy加密后生成post签名并返回给前端前端将postPolicy和post签名一起传给OSS服务器OSS服务器自己也存了密钥将postPolicy加密后的字串与post签名对比如果一致则验证通过。1.1 配置OSS引入依赖dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alicloud-oss/artifactIdversion2.2.0.RELEASE/version/dependency将用户ID和密钥配置到springboot的yml文件中spring:alicloud:access-key:# 2.3.2中用户idsecret-key:# 2.3.2中用户keyoss:endpoint:#oss-cn-beijing.aliyuncs.com # 2.2中检查配置最下面可以查阅到Endpoint地域节点bucket:# gulimall-hellolpf # 2.2中创建的Bucket名字1.2 配置java服务端RestControllerRequestMapping(/oss)publicclassOssController{AutowiredOSSossClient;/** * 获取yml中配置 */Value(${spring.cloud.alicloud.oss.endpoint})privateStringendpoint;Value(${spring.cloud.alicloud.oss.bucket})privateStringbucket;Value(${spring.cloud.alicloud.access-key})privateStringaccessId;/** * 获取对象签名 */RequestMapping(/policy)publicRpolicy(){// https://gulimall-wan.oss-cn-shanghai.aliyuncs.comStringhosthttps://bucket.endpoint;// 文件在bucket存储目录若不存在则会自动创建路径。使用日期作为目录StringdirnewSimpleDateFormat(yyyy-MM-dd).format(newDate())/;MapString,StringrespMapnull;try{longexpireTime30;longexpireEndTimeSystem.currentTimeMillis()expireTime*1000;DateexpirationnewDate(expireEndTime);//// PostObject请求最大可支持的文件大小为5 GB即CONTENT_LENGTH_RANGE为5*1024*1024*1024。PolicyConditionspolicyCondsnewPolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE,0,1048576000);policyConds.addConditionItem(MatchMode.StartWith,PolicyConditions.COND_KEY,dir);//postPolicyStringpostPolicyossClient.generatePostPolicy(expiration,policyConds);byte[]binaryDatapostPolicy.getBytes(utf-8);//传给oss服务器的原始postPolicyStringencodedPolicyBinaryUtil.toBase64String(binaryData);//密钥加密后的postSignatureStringpostSignatureossClient.calculatePostSignature(postPolicy);respMapnewLinkedHashMapString,String();respMap.put(accessid,accessId);respMap.put(policy,encodedPolicy);respMap.put(signature,postSignature);respMap.put(dir,dir);respMap.put(host,host);respMap.put(expire,String.valueOf(expireEndTime/1000));}catch(Exceptione){System.out.println(e.getMessage());}finally{ossClient.shutdown();}returnR.ok().put(data,respMap);}}1.3 配置Web端结合官方用例修改的HTML上传界面注意这两行一定要根据实际情况修改。const baseUrl “http://localhost:88/api/thirdparty”;fetch(baseUrl “/oss/policy”, { method: “GET” })遇到请求跨域的问题,请参考2.2.3 https://blog.csdn.net/qq_43190347/article/details/167496275?spm1011.2415.3001.10575sharefrommp_manage_link!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8/metanameviewportcontentwidthdevice-width, initial-scale1.0/title服务端生成签名上传文件到OSS/title/headbodydivclasscontainerformdivclassmb-3labelforfileclassform-label选择文件:/labelinputtypefileclassform-controlidfilenamefilerequired//divbuttontypesubmitclassbtn btn-primary上传/button/form/divscripttypetext/javascriptdocument.addEventListener(DOMContentLoaded,function(){constformdocument.querySelector(form);constfileInputdocument.querySelector(#file);form.addEventListener(submit,(event){event.preventDefault();constfilefileInput.files[0];if(!file){alert(请选择一个文件再上传。);return;}// 后端网关地址按实际情况修改constbaseUrlhttp://localhost:88/api/thirdparty;fetch(baseUrl/oss/policy,{method:GET}).then((response){if(!response.ok){thrownewError(获取签名失败);}returnresponse.json();}).then((result){// 后端返回结构为 { code, msg, data: { accessid, policy, signature, dir, host, expire } }if(result.code!0){thrownewError(获取签名失败: result.msg);}constdataresult.data;// file 必须为最后一个表单域// key 使用 dir 前缀 时间戳 文件名避免同名覆盖constkeydata.dirDate.now()-file.name;letformDatanewFormData();formData.append(key,key);formData.append(policy,data.policy);formData.append(OSSAccessKeyId,data.accessid);formData.append(success_action_status,200);formData.append(signature,data.signature);formData.append(file,file);returnfetch(data.host,{method:POST,body:formData});}).then((response){if(response.ok){console.log(上传成功);alert(文件已上传);}else{console.log(上传失败,response);alert(上传失败请稍后再试);}}).catch((error){console.error(发生错误:,error);});});});/script/body/html