javaoss阿里云oss实现文件上传
小吴顶呱呱步骤:
1.https://oss.console.aliyun.com/overview
开通 对象存储OSS
2.查看文档:
常用入口=》API文档=》在帮助中心打开【https://help.aliyun.com/document_detail/31947.html?spm=5176.8465980.help.dexternal.4e701450Bu0s0M】
1)专业术语【https://help.aliyun.com/document_detail/31947.html】
Bucket:一个项目创建一个Bucket,存储空间
Object:对象是 OSS 存储数据的基本单元
Region:地域表示 OSS 的数据中心所在物理位置
Endpoint:访问OSS文件域名URL
AccessKey:访问密钥
读写权限:私有/公共度/公共读写
服务端加密:无
实施日志:不开通
3.上传方式【建议采用方式三】
方式一:
文件先上传到应用服务器,然后再上传到OSS
此方式会文件上传会经过后台服务器,占用大量带宽,导致用户访问其他业务卡顿。
方式二:
文件直接由前端通过js代码上传到oss中
此方式会暴露出oss文件的秘钥给浏览器,非常不安全。
方式三:
服务端签名后直传

	1)用户向应用服务器请求上传Policy
	2)应用服务器返回上传Policy【由服务器控制上传地址等信息】
	3)用户直接上传OSS
4.获取子用户Accesskeys
1)鼠标移至账号头像,点击Accesskeys管理,使用子用户Accesskeys【首次使用需要开通RAM访问控制】
2)新增用户
登录名称:gulimall-wan
显示名称:gulimall
访问方式:编程访问
3)新增完成复制AccessKeyID和secret
4)添加权限:AliyunOSSFullAccess
5)修改CORS
	打开bucket -> 权限管理 -> 跨域设置 -> 设置 -> 创建规则
	来源:* 
	允许Headers:* 
	允许Methods:POST
使用原生sdk上传的demo:
https://help.aliyun.com/document_detail/91868.html?spm=a2c4g.11186623.2.16.1d2f7eaeOSyN4O#concept-ahk-rfz-2fb
使用aliyun封装的SDK实现上传,通过以下网址找到演示demo https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 
 | ***OSS放在单独第三方微服务模块1.创建第三方微服务:
 com.atguigu.gulimall
 gulimall-third-party
 谷粒商城-第三方服务
 选择openFeign,SpringWeb
 2.添加依赖
 3.启动类注解添加,主pom添加模块
 @EnableDiscoveryClient
 <module>gulimall-third-party</module>
 
 4.application.yml
 server:
 port: 30000
 
 spring:
 application:
 name: gulimall-third-party
 cloud:
 nacos:
 discovery:
 server-addr: 127.0.0.1:8848
 alicloud:
 access-key: ************
 secret-key: *************
 oss:
 endpoint: oss-cn-shanghai.aliyuncs.com
 bucket: gulimall-wan
 
 logging:
 level:
 com.atguigu.gulimall: debug
 
 5.创建OssController,返回policy凭证【获取对象签名】
 @RestController
 public class OssController {
 
 @Autowired
 OSS ossClient;
 
 @Value("${spring.cloud.alicloud.oss.endpoint}")
 private String endpoint;
 @Value("${spring.cloud.alicloud.oss.bucket}")
 private String bucket;
 @Value("${spring.cloud.alicloud.access-key}")
 private String accessId;
 
 @RequestMapping("/oss/policy")
 public R policy() {
 
 String host = "https://" + bucket + "." + endpoint;
 
 
 
 
 
 String dir = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "/";
 
 
 
 
 Map<String, String> respMap = null;
 try {
 long expireTime = 30;
 long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
 Date expiration = new Date(expireEndTime);
 
 PolicyConditions policyConds = new PolicyConditions();
 policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
 policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
 
 String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
 byte[] binaryData = postPolicy.getBytes("utf-8");
 String encodedPolicy = BinaryUtil.toBase64String(binaryData);
 String postSignature = ossClient.calculatePostSignature(postPolicy);
 
 respMap = new LinkedHashMap<String, 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 (Exception e) {
 
 System.out.println(e.getMessage());
 } finally {
 ossClient.shutdown();
 }
 return R.ok().put("data", respMap);
 }
 }
 
 6.配置网关
 - id: third_party_route
 uri: lb:
 predicates:
 - Path=/api/thirdparty
 
 
 
 | 
前端配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | 1.拷贝upload组件放到component中,修改multiUpload.vue和singleUpload.vue文件修改成自己的外网Bucket域名
 action="http://gulimall-wan.oss-cn-shanghai.aliyuncs.com"
 
 2.然后在图片上传地址栏修改vue代码,使用单文件上传
 在brand-add-or-update.vue中导入
 1)import SingleUpload from "@/componets/upload/singleUpload"
 2)在data 的components:{SingleUpload}
 3)在</template>中就可以使用了 <single-upload>来代替之前的<el-input>标签【自定义节点】
 
 3.设置跨域,允许bucket跨域请求
 在oss里面修改管理控制台修改:
 https://oss.console.aliyun.com/bucket/oss-cn-shanghai/gulimall-wan/permission/cors
 
 |