网站一般都会有上传功能,而对象存储服务oss是一个很好的选择。可以快速的搭建起自己的上传文件功能。
该文章以使用阿里云的OSS功能为例,记录如何在客户端使用阿里云的对象存储服务。
服务端签名后直传
背景
采用JavaScript客户端直接签名(参见JavaScript客户端签名直传)时,AccessKey ID和AcessKey Secret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。
流程介绍
流程如下图所示:
本示例中,Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。但本示例中的服务端无法实时了解用户上传了多少文件,上传了什么文件。如果想实时了解用户上传了什么文件,可以采用服务端签名直传并设置上传回调。
创建对象存储
1. 创建bucket
快捷入口:https://oss.console.aliyun.com/bucket
bucket读写权限为:公共读
2. 添加子用户分配权限
鼠标移至右上角的用户头像当中,点击 添加AccessKey管理, 然后选择使用子用户AccessKey,因为使用子用户可以只分配OSS的读写权限。这样比较安全。
访问方式选择:编程访问(即使用AccessKey ID 和 AccessKey Secret, 通过API或开发工具访问)
然后点击子用户的添加权限操作。
权限选择:AliyunOSSFullAccess(管理对象存储服务(OSS)权限)
3.保存AccessKey信息
创建了用户后,会展示这么一个页面
此时你需要保存好AccessKeyID和AccessSecret,否则这个页面关闭后就找不到了。
maven依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
最新版本可以看这里:https://help.aliyun.com/document_detail/32009.html?spm=a2c4g.11186623.6.807.39fb4c07GmTHoV
测试上传
测试代码
// Endpoint以杭州为例,其它Region请按实际情况填写。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucketName>", "test", new File("C:\Users\82131\Desktop\logo.jpg"));
// 上传文件。
ossClient.putObject(putObjectRequest);
// 关闭OSSClient。
ossClient.shutdown();
测试成功后就可以看到test图片了,如图:
服务端签名实现流程
修改CORS
客户端进行表单直传到OSS时,会从浏览器向OSS发送带有Origin的请求消息。OSS对带有Origin头的请求消息会进行跨域规则(CORS)的验证。因此需要为Bucket设置跨域规则以支持Post方法。
进入bucket后,选择权限管理 -》跨域设置 -》创建规则
后端代码
@RestController
public class OssController {
@RequestMapping("/oss/policy")
public Map<String, String> policy() {
String accessId = "<yourAccessKeyId>"; // 请填写您的AccC67&BfwCЦ6UWBg&G26UWBpЦWFVfVТ6G3Т6UW@ТТFFТ&WGW&ТFТW6W$rpТfBfwC&SУFcУG66fc#G&h{37G&7^ih~KhyKZK~{).YXnYyNZ{^in[nKJ~Ziih~j>Xi8##Ю[XZ^X&VcGG3V&BRb3c37&3Frcc#2SC3cfC3F&V&WFW&r#G3V&BRb3c37&3Frcc#2SC3cfC3F&VcGG3V&BRb3c37&3Frcc#2SC3cfC3F&V&WFW&r#G3V&BRb3c37&3Frcc#2SC3cfC3FjX[>KNiXzNKXNih~z[K{NZIyX[>iXzNKXh^Z{J.zKK^XNih~zhn{~{XyNyX[>ih~z[ZJ~Z^YZIiJ |