阿里云 OSS 客户端直传 Policy 模式使用

这篇具有很好参考价值的文章主要介绍了阿里云 OSS 客户端直传 Policy 模式使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、OSS Policy 模式

Post policy 是阿里推出的一种安全的文件上传方式,在传统的方式一般都是客户端将文件上传至服务端,再由服务端将文件上传至具体的文件系统比如阿里云的OSS,这种方式不仅增加了我们服务器的带宽,而且效率也不怎么高,为此阿里提出的policy 模式,是由服务端进行签名,客户端拿到签名后的 policy 直连阿里云的OSS进行上传文件,并且阿里也提供了上传后的回调方案。

流程如下图所示:
阿里云 OSS 客户端直传 Policy 模式使用
用户要上传一个文件到OSS,而且希望将上传的结果返回给应用服务器时,需要设置一个回调函数,将请求告知应用服务器。用户上传完文件后,不会直接得到返回结果,而是先通知应用服务器,再把结果转达给用户。

具体的就不做讲解了,毕竟是阿里中国的,不了解的大家可以去看下官网的介绍,下面看下使用的过程,

二、获取 Bucket 及 AccessKey ID 和 AccessKey Secret

在操作之前确保已经开通了OSS功能。

创建 Bucket

首先进入OSS控制台:
阿里云 OSS 客户端直传 Policy 模式使用
点击Bucket:
阿里云 OSS 客户端直传 Policy 模式使用
创建一个
阿里云 OSS 客户端直传 Policy 模式使用
阿里云 OSS 客户端直传 Policy 模式使用
主要填写bucket名称和地域,其他看具体情况选择。填写后点击下面的确认按钮。下面自动跳转的页面就可以看到bucket 的域名了。
阿里云 OSS 客户端直传 Policy 模式使用
下面我们上传和下载都需要使用这个域名,这里还需要配制bucket的跨域允许,因为我们是客户端直连肯定存在跨域问题。

点击 bucket列表,进入刚才创建的bucket
阿里云 OSS 客户端直传 Policy 模式使用
点击权限管理:
阿里云 OSS 客户端直传 Policy 模式使用
下面就有一个跨域设置了。
阿里云 OSS 客户端直传 Policy 模式使用
点击设置,创建一个规则:
阿里云 OSS 客户端直传 Policy 模式使用
主要设置来源和请求方式即可,来源不做限制就填写*即可。
阿里云 OSS 客户端直传 Policy 模式使用

创建RAM用户

下面还需创建一个RAM用户,回到最初的OSS控制台页面,右边常用入口由访问控制RAM,点击它进入RAM控制台。
阿里云 OSS 客户端直传 Policy 模式使用

点击用户,开始创建用户:

阿里云 OSS 客户端直传 Policy 模式使用
阿里云 OSS 客户端直传 Policy 模式使用
主要填写下面标出来的。
阿里云 OSS 客户端直传 Policy 模式使用
点击确认后,会出现该用户的AccessKey IDAccessKey Secret,者这两个需要记下来,后面需要使用。阿里云 OSS 客户端直传 Policy 模式使用
阿里云 OSS 客户端直传 Policy 模式使用
下面需要给该用户分配OSS的权限,点击该页面的左边菜单的用户,出现用户列表,列表中添加权限的操作。
阿里云 OSS 客户端直传 Policy 模式使用
阿里云 OSS 客户端直传 Policy 模式使用

到此在阿里云上的操作基本就完成了,注意上面的bucket 的名称和域名,以及AccessKey IDAccessKey Secret 后面都要使用。

三、测试是否可以上传文件

在上传创建好bucket和RAM用户后,我们就可以新建一个SpringBoot项目测试下,是否可以上传文件。

新建SpringBoot项目,在pom中引入阿里云oss的依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>

在配制文件中配制 access-keysecret-key 以及 endpoint,修改application.yml文件:

server:
  port: 8080

alibaba:
  cloud:
    access-key: LTAI5tJxf****MCQVK*****
    secret-key: Urc3oALFm*****lF6sAzRMwEF*****
    oss:
      endpoint: oss-cn-shanghai.aliyuncs.com

access-keysecret-key就是上面创建RAM用户后得到的,endpoint是创建Bucket是选的地区,在Bucket页面的概述就可以看到。
阿里云 OSS 客户端直传 Policy 模式使用
下面编写测试接口:

@Slf4j
@RestController
@RequestMapping("/file")
public class UpdateController {
    @Resource
    OSS ossClient;

    @GetMapping("/upload")
    public String file() throws FileNotFoundException {
        String bucketName = "bxcosstest"; // Bucket的名称
        String localFile = "C:/Users/Administrator/Desktop/photo.jpg";
        String fileKeyName = "photo2.jpg"; // 上传至阿里云的名称,可以使用 / 附带文件夹
        InputStream inputStream = new FileInputStream(localFile);
        PutObjectResult putObjectResult = ossClient.putObject(bucketName, fileKeyName, inputStream);
        log.info(putObjectResult.getETag());
        return "success";
    }
}

下面在浏览器调用接口http://localhost:8080/file/upload
阿里云 OSS 客户端直传 Policy 模式使用
已经打印出Etag,看下阿里云的bucket的控制台:
阿里云 OSS 客户端直传 Policy 模式使用
已经上传成功了,下面我们就可以使用下Policy 模式进行文件的上传了。

四、获取服务端认证的 Policy

先修改下我们的配制文件,将Bucket的名称配制在配制文件中:

alibaba:
  cloud:
    access-key: LTAI5tJxf****MCQVK*****
    secret-key: Urc3oALFm*****lF6sAzRMwEF*****
    oss:
      endpoint: oss-cn-shanghai.aliyuncs.com
      bucketName: bxcosstest

创建获取Policy 的接口:

@Slf4j
@CrossOrigin
@RestController
public class PolicyController {
    @Resource
    OSS ossClient;

    @Value("${alibaba.cloud.access-key}")
    private String accessId;

    @Value("${alibaba.cloud.secret-key}")
    private String accessKey;

    @Value("${alibaba.cloud.oss.endpoint}")
    private String endpoint;

    @Value("${alibaba.cloud.oss.bucketName}")
    private String bucketName;


    @GetMapping("/getPolicy")
    public JSONObject getPolicy() throws UnsupportedEncodingException, JSONException {
        // host的格式为 bucketname.endpoint
        String host = StringFormatter.concat("https://", bucketName, ".", endpoint).getValue();
        // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
        // String callbackUrl = "http://88.88.88.88:8888";
        // 每一天产生一个文件夹
        String dir = LocalDate.now().toString() + "/"; // 用户上传文件时指定的前缀,如果是 / 则自动检测为文件夹。

        JSONObject jsonObject = new JSONObject();

        long expireTime = 100;
        long expireEndTime = System.currentTimeMillis() + expireTime * 1000; //过期时间 100 秒
        Date expiration = new Date(expireEndTime);
        // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
        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);

        jsonObject.put("OSSAccessKeyId", accessId);
        jsonObject.put("policy", encodedPolicy);
        jsonObject.put("signature", postSignature);
        jsonObject.put("dir", dir);
        jsonObject.put("host", host);
        jsonObject.put("expire", String.valueOf(expireEndTime / 1000));
        return jsonObject;
    }
}    

启动服务,调用接口:http://localhost:8080/getPolicy

阿里云 OSS 客户端直传 Policy 模式使用

下面使用拿到的参数使用PostMan上传文件测试:
阿里云 OSS 客户端直传 Policy 模式使用

去阿里云中查看文件:
阿里云 OSS 客户端直传 Policy 模式使用
阿里云 OSS 客户端直传 Policy 模式使用

五、前端使用认证后的 Policy 上传文件

测试上穿的程序:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>文件上传</title>
</head>
<body>
<div>
    <input type="file" id="file">

    <button id="upload">上传文件</button>
</div>
</body>

<script src="js/jquery-1.10.2.min.js"></script>
<script>
    var filename = '';
    var file = null;
    $("#file").change(function () {
        let f = document.getElementById("file").files[0];
        if (typeof f != "undefined") {
            let src = window.URL.createObjectURL(f);
            if (src === null || src === '') {
                return;
            }
            filename = f.name;
            file = f;
        }
    });

    $("#upload").click(function () {
        let data = getPolicy();
        var formData = new FormData();
        formData.append("OSSAccessKeyId", data.OSSAccessKeyId);
        formData.append("signature", data.signature);
        formData.append("policy", data.policy);
        formData.append("key", data.dir + (new Date()).valueOf() + filename);//注意顺序,file要在key的后面。不然会返回找不到key 的错误
        formData.append("file", file);
        formData.append("success_action_status", 200);
        $.ajax({
            url: data.host,
            type: "POST",
            data: formData,
            contentType: false,
            processData: false,
            success: function (data, status, response) {
                if (status === 'success') {
                    alert("上传成功!")
                }
            },
            error: function (e) {
                alert("上传失败!");
                console.log("失败", e);
            }
        });
    });

    function getPolicy() {
        var restultData = null;
        $.ajax({
            url: "http://localhost:8080/getPolicy",
            type: "GET",
            async: false,
            success: function (data, status, request) {
                if (status === 'success') {
                    restultData = data;
                }
            },
            error: function (e) {
                console.log("失败", e);
            }
        });
        return restultData;
    }


</script>
</html>

测试
阿里云 OSS 客户端直传 Policy 模式使用
查看阿里云Bucket控制页面:
阿里云 OSS 客户端直传 Policy 模式使用文章来源地址https://www.toymoban.com/news/detail-400967.html

到了这里,关于阿里云 OSS 客户端直传 Policy 模式使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南

    Minio的元数据 数据存储 MinIO对象存储系统没有元数据数据库,所有的操作都是对象级别的粒度的,这种做法的优势是: 个别对象的失效,不会溢出为更大级别的系统失效。 便于实现\\\"强一致性\\\"这个特性。此特性对于机器学习与大数据处理非常重要。 数据管理 元数据与数据一起

    2024年02月11日
    浏览(56)
  • Android安全——客户端安全要点,阿里P8大佬亲自教你

    区别基于Binder实现的BroadcastReceiver,LocalBroadcastManager 是基于Handler实现的,拥有更高的效率与安全性。安全性主要体现在数据仅限于应用内部传输,避免广播被拦截、伪造、篡改的风险。简单了解下用法: 自定义BroadcastReceiver public class MyReceiver extends BroadcastReceiver { @Override pu

    2024年04月24日
    浏览(30)
  • 前端阿里云OSS直传,微信小程序版本

    网络上许多的文章资料,全是使用阿里云官方的SDK,ali-oss插件去做直传。可是各位素未谋面的朋友要注意,这个 SDK它支持web环境 使用,也就是 PC端浏览器 。 当 项目环境 切换到 微信小程序 ,是无法使用这种方式的,当然官方也有给出微信小程序直传的文档,继续往下看。

    2024年02月07日
    浏览(45)
  • vue+iviewUi+oss直传阿里云上传文件

    用户获取oss配置信息将文件上传到阿里云,保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss,轻量型的应用可以直接将文件资源上传到服务器就行。废话不多说,下面开始总结本人上传到oss的踩坑之旅。 1、第一

    2024年02月13日
    浏览(46)
  • 【spark客户端】Spark SQL CLI详解:怎么执行sql文件、注释怎么写,支持的文件路径协议、交互式模式使用细节

    The Spark SQL CLI is a convenient interactive command tool to run the Hive metastore service and execute SQL queries input from the command line. Note that the Spark SQL CLI cannot talk to the Thrift JDBC server. spark SQL Cli 用于运行hive metastore服务和通过命令行执行sql查询。注意,Spark SQL CLI不能和Thrift JDBC server进行通讯。  

    2024年02月08日
    浏览(52)
  • 微信小程序 - 超详细 “纯前端“ 将文件上传到阿里云 OSS,最新阿里云 OSS 直传音视频、图片、word、excel、ppt、office 文档(全程无需后端,前端文件直传阿里云oss服务器)

    网上的教程乱七八糟却文件少代码(并且没注释),而且都已经很老了,对于新手来说真的无从下手。 本文站在新手小白的角度, 实现微信小程序开发中,“前端直传” 上传文件到阿里云oss对象存储的详细教程, 无需后端 (纯前端自己完成所有签名、上传),保证 100% 成

    2024年02月13日
    浏览(150)
  • 微信小程序录音直传阿里云OSS并语音识别

    如题:做一个录音文字识别功能,知识点有三个,分别是微信小程序的录音功能、录音文件直传阿里云OSS、使用阿里云的录音文件识别接口返回识别后的文字 官方文档:微信小程序全局唯一的录音管理器 RecorderManager wxml: js:需要注意的是,点击开始录音时要判断当前是否获

    2024年02月10日
    浏览(56)
  • 基于Spring OAuth2 之客户端凭证模式演示

    客户端凭证模式(Client Credentials Grant) :适用于客户端访问自己的资源的情况,而不是代表用户访问资源。 客户端应用程序使用其自身的凭证(即客户端ID和客户端密钥)直接向身份验证服务器进行身份验证,并获取访问令牌。此授权方式不涉及用户,因为它只允许客户端访

    2024年02月14日
    浏览(34)
  • Hive的安装与使用(内嵌模式derby+将Hive的元数据配置到MySQL)配置hive的远程访问,实现多客户端访问安全机制

    前期准备:因为hive是构建在hadoop集群之上的,所以要先进行hadoop集群的搭建 一、内嵌模式:使用hive内置的关系型数据库(derby)来存储元数据 1.下载并上传到虚拟机上,我是在/opt目录下 2.解压并且重命名 3.配置hive环境,个人习惯把配置文件放在my_enc.sh中 4. 初始化元数据库

    2024年02月06日
    浏览(44)
  • JCG无线路由器的AP客户端模式设置图解

    其实就是将无线路由器当成一个无线网卡来使用 需要注意的地方就是 要将这个路由器的ip段与原来的ip段不一样,例如原来的是 192.168.1.1那么,这个路由器(当无线上网卡)的路由器的ip段可以为 192.168.2.1等。 下面的详细的介绍: AP Client模式可以提供WDS之外的另一种无线网络扩

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包