2021-06-18
任何问题都有解决的办法,无法可想的事是没有的。──爱迪生
问题场景:
一个thymeleaf
项目,上传图片、视频是直接使用Java
代码保存到服务器上
于是服务器压力激增,网页静态资源变得卡顿
于是
我们需要将图片、视频上传移植到阿里云OSS
上
阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。
一句话描述:它是一个很棒的存取文件的在线服务器
我们可以使用它进行客户端上传,文件不通过服务端也可以上传,这样减轻了我们服务端压力
我们需要一系列配置才可以对接完成,查阅阿里云OSS
官方文档发现:JavaScript客户端签名直传的方式最为简单,但这种方式是有弊端的,客户端通过JavaScript
把存取文件的认证信息写在代码里面有泄露的风险
因此
我们采用服务端签名后直传的方式进行上传文件,我们待会儿介绍~
准备工作:
登录阿里云官网。
将鼠标移至产品,单击对象存储 OSS,打开 OSS 产品详情页面。
在 OSS 产品详情页,单击立即开通。
开通服务后,在 OSS 产品详情页单击管理控制台直接进入 OSS 管理控制台界面。
您也可以单击位于官网首页右上方菜单栏的控制台,进入阿里云管理控制台首页,然后单击左侧的对象存储 OSS 菜单进入 OSS 管理控制台界面。
根据官方文档提供步骤视频可以完成开通、创建Bucket
、进行授权、配置跨域等
我们到阿里云RAM
访问控制台来添加一个用户
填入用户账号信息、勾选编程访问后点击确定
然后我们点击复制,找个地方粘贴下来我们的AccessKey ID
以及AccessKey Secret
然后我们点击添加权限为该用户授权
开始对接
官方文档流程图片:
这里可以这么理解:
假设小王接到老板的任务:将这堆货物放到仓库中去,但仓库大门的门禁需要门卡
所以上图中的类比
1:小王去保管室拿门卡
2:小王拿到门卡回来
3:小王搬运货物到仓库,存放货物
因此我们首先先做“保管室”的功能
后端代码实现
这里就是用我们的Java
代码在服务端实现:
引入alicloud-oss
的依赖
1 | <dependency> |
application.yml
,注意版本或者依赖不同,配置有可能改变,例如我最下面的Demo
使用的boot
的依赖(配置方式发生了变化,不过我们代码都还是一样的,只是注意@Value需要写对)
1 | spring: |
Controller
1 | package com.ruben.simpleoss.controller; |
Service
1 | package com.ruben.simpleoss.service; |
ServiceImpl
1 | package com.ruben.simpleoss.service.impl; |
然后我们运行访问一下,就像第一步小王去拿门卡了
可以看到拿到我们的临时凭证了,就像第二步小王拿着门卡回来了
然后我们现在要拿着这些凭证去上传文件,就像第三步小王要去存货物
按照PostObject
的文档测试一下
上传完成之后我们这里是没有回调的,因为我们这里没有配置callback
,如有需要,可以查看Callback
文档
上传完成之后我们可以在控制台看到我们上传的文件
然后如果我们在代码里使用文件的url
的话,就使用host
+/
+(key
替换掉${filename}
占位符为文件名)即可
例如我的host
是https://will-deprecated.oss-cn-chengdu.aliyuncs.com
加上/
再加上key
为:2021-06-18/17585793-95b9-4dbd-8dfc-2302d6afa5df_${filename}
替换掉文件名就是2021-06-18/17585793-95b9-4dbd-8dfc-2302d6afa5df_partnerhead.jpg
(其实我测试过了,不用${filename}
占位符,直接使用文件名也可以上传成功)
最终https://will-deprecated.oss-cn-chengdu.aliyuncs.com/2021-06-18/17585793-95b9-4dbd-8dfc-2302d6afa5df_partnerhead.jpg
则是我们完整的文件路径
前端代码实现
使用html
+vue
主页面,引用组件的地方
1 |
|
自己写的组件:
1 | function policy() { |
注意引入一些文件:
最终效果:
项目源码
本次案例完整项目代码:https://gitee.com/VampireAchao/simple-oss.git
这个项目基本能应对绝大部分场景,它那次请求签证接口是使用的jQuery
的ajax
如果您是纯vue
项目,可以看我以往这个项目https://gitee.com/VampireAchao/my-vue-app.git
小结
通过对这次的OSS
对接,复习了如何在html
页面中引入vue
、elementUI
、引入vue
自定义组件、进行第三方服务接入等…
最后,希望本文能对您有所帮助~