阿里云oss存储

news2024/11/23 23:42:38

文章目录

  • 准备阿里云的OSS
    • 控制台
    • 创建bucket
    • 获取AccessKey
  • java使用oss
    • 导入依赖
    • 官网demo
    • 修改参数
    • 运行demo代码
  • 封装工具类
  • Oss下载
    • 如何保证指定时间段内可以访问私有权限的图片文件?

准备阿里云的OSS

控制台

访问阿里云官网,登录以后,右上角有个控制台
在这里插入图片描述
点击左上角,然后搜索oss
在这里插入图片描述
因为我没有开通过,所以提示开通
在这里插入图片描述
点击开通
在这里插入图片描述

创建bucket

在这里插入图片描述
填写bucket名称和选择读写权限为公共读,然后完成创建
在这里插入图片描述
然后bucket列表中,就有刚才创建的bucket了
在这里插入图片描述
点击列表中的bucket名称,然后点击概览,看到一些基础信息,其中有个Endpoint,上传文件会用到
在这里插入图片描述

获取AccessKey

鼠标移到右上角头像处,有个AccessKey管理,点击来获取AccessKey,

在这里插入图片描述
选择继续使用
在这里插入图片描述
然后点击创建AccessKey,再验证手机验证码,就成功创建,需要注意的是,获取到AccessKey以后,要保存好,关闭这个窗口就看不到了
在这里插入图片描述

java使用oss

左边最下面有个sdk下载
在这里插入图片描述
java后面有个小图标,点一下
在这里插入图片描述
文档中心打开
在这里插入图片描述

导入依赖

左边找到java-安装,我是maven项目,选择导入pom依赖,,它有说明,java9以上要引入下面那部分,具体看你版本,我是9以上,两部分依赖都要
在这里插入图片描述

        <!--oss依赖-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.17.4</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- no more than 2.3.3-->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.3</version>
        </dependency>

官网demo

依赖有了,现在要做的就是上传文件的测试demo了,找到测试demo,粘到项目代码中
在这里插入图片描述

修改参数

粘贴过来以后,把一些关键参数换成我们实际的数值
demo需要修改的参数说明
在这里插入图片描述

运行demo代码

package com.wzw.alioss;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;

public class DemoTest {
    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        //EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        String ACCESS_KEY_ID = "LTAI5tRHMRGaK14mSm1LNRkB";
        String ACCESS_KEY_SECRET = "mrniIO007QfxpdsMzW0CDROcPjoTfg";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "ali-bucket-space";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "dog.jpg";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, ACCESS_KEY_ID,ACCESS_KEY_SECRET);

        try {

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new FileInputStream("C:\\Users\\w4523\\Desktop\\dogjpg.jpg"));

            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

}

运行,上传成功
在这里插入图片描述

封装工具类

上面参数说明已经看到了,其实很多东西都是固定的,只有一些值需要传入就可以了,现在封装成一个工具类,只传入我们要上传的文件对象就可以了

package com.wzw.alioss.com.wzw.alioss.util;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.InputStream;

public class AliOssUtil {

    //地域节点
    private static final String endpoint="https://oss-cn-beijing.aliyuncs.com";
    //ACCESS_KEY_ID
    private static final String ACCESS_KEY_ID="LTAI5tRHMRGaK14mSm1LNRkB";
    //ACCESS_KEY_SECRET
    private static final String ACCESS_KEY_SECRET="mrniIO007QfxpdsMzW0CDROcPjoTfg";
    //bucket名称
    private static final String bucketName="ali-bucket-space";


    /**
     * 上传文件到OSS
     * @param objectName
     * @param inputStream
     * @return
     * @throws Exception
     */
    public static String uploadFile(String objectName, InputStream inputStream) throws Exception {

        //文件存储的地址
        String url="";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, ACCESS_KEY_ID,ACCESS_KEY_SECRET);

        try {

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);

            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
            /**
             * 示例中上传的文件地址:https://ali-bucket-space.oss-cn-beijing.aliyuncs.com/dog.jpg
             * 根据这个地址url可以观察到,它是https://+bucketName+区域节点+objectName
             */
            url="https://"+bucketName+"."+endpoint.substring(endpoint.lastIndexOf("/")+1)+"/"+objectName;
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return url;
    }
}

controller调用

package com.wzw.alioss.com.wzw.alioss.controller;

import com.wzw.alioss.com.wzw.alioss.util.AliOssUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

@RestController
public class AliOssController {

    /**
     * 上传文件到OSS
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public String uploadFile(MultipartFile file) throws Exception {
        String fileName=file.getOriginalFilename();
        String url = AliOssUtil.uploadFile(UUID.randomUUID()+fileName.substring(fileName.lastIndexOf(".")), file.getInputStream());
        return url;
    }
}

发送postman请求,看到结果也返回了url
在这里插入图片描述
查看bucket,上传成功
在这里插入图片描述

整个示例代码:https://gitee.com/w452339689/alioss_test

Oss下载

如果是公开的,直接访问固定的url就行,如果是私有的,需要授权

如何保证指定时间段内可以访问私有权限的图片文件?

访问私有云文件url提示如下
在这里插入图片描述
私有云访问也是需要认证的,可以通过文件名授权一个临时的url,在指定的时间内可以访问。

官方文档:https://help.aliyun.com/zh/oss/user-guide/how-to-access-a-private-image-object-within-a-specific-period-of-time?spm=a2c4g.11186623.0.i20
在这里插入图片描述

成功获取,查看能不能访问到,完成
在这里插入图片描述
封装工具类

    /**
     * 阿里云oss生成临时访问路径
     * @param objectName 文件名631ffc15-83d8-478f-95e5-5a8a96afa7d4.png
     */
    public static String getOssUrl(String objectName) {

        String fileUrl="";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, ACCESS_KEY_ID,ACCESS_KEY_SECRET);

        try {
            // 设置签名URL过期时间为1天,单位为秒,
            Date expiration = new Date(new Date().getTime() + 3600 * 1000);
            // 生成以GET方法访问的签名URL,在签名URL有效期内访客可以直接通过浏览器访问相关内容。
            URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
            System.out.println(url.toString());
            if(Optional.ofNullable(url).isPresent()) {
                return fileUrl=url.toString();
            }
        } catch (OSSException oe) {
            log.error("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            log.error("Error Message:" + oe.getErrorMessage());
            log.error("Error Code:" + oe.getErrorCode());
            log.error("Request ID:" + oe.getRequestId());
            log.error("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            log.error("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            log.error("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return fileUrl;
    }

可能遇到一个问题,访问临时url,提示如下,看信息应该是时间不对,我之前设置的是30天,调整成1天就好了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1869239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Omniverse 下载 isaac sim过慢的解决办法

比如在上海地区&#xff0c;下载isaac只有 200kb/s&#xff0c;这8个G下载要很长时间 对于着急的小伙伴&#xff0c;可以直接去日志里拿下载链接&#xff0c;在Omniverse里点右上角小人&#xff0c;点开里面SETTINGS&#xff0c;如图 点击&#xff0c;LOGS LOCATION&#xff0c…

校企合作,为人才培养注入新动力

树莓集团在校企合作育人方面取得了显著成效&#xff0c;通过共建专业、定制课程、实习实训等多种方式&#xff0c;实现了教育资源的优化配置和高效利用&#xff0c;为高校和企业提供了更多的发展机会和合作空间。 1、共建专业与实验室&#xff1a;树莓集团与高校共同建设数字产…

U-boot相关基础知识

U-boot和Bootloader之间的关系 U-Boot是Bootloader的一种实现&#xff0c;它专门用于嵌入式系统&#xff0c;特别是那些基于ARM、MIPS等处理器的系统。U-Boot提供了丰富的硬件支持和功能&#xff0c;使得开发者能够轻松地初始化硬件、加载操作系统内核&#xff0c;并进行一些基…

反向代购是怎么火起来的?今后的发展趋势如何?

反向代购和反向海淘的兴起可以归因于多个因素&#xff0c;这些因素共同推动了海外消费者对中国商品的需求和购买热潮。以下是对其火起来的原因的详细分析&#xff1a; 海外华人华侨的需求增加&#xff1a; 随着中国国际移民群体的扩大&#xff0c;海外华人华侨数量不断增多。这…

GD32F303 使用PA8输出内部时钟频率

前面给小伙伴介绍过串口发送和接收异常可能的一些原因&#xff0c;其中就有说到时钟频率对于异步通讯的重要性。而我们通过程序去配置的时钟都是理论值&#xff0c;那如果想要获得内部一些时钟频率的实际值&#xff0c;需要怎样做呢&#xff1f;今天&#xff0c;我们以GD32F303…

小项目——MySQL集训(学生成绩录入)

ddl语句 -- 创建学生信息表 CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 学生ID,name VARCHAR(50) NOT NULL COMMENT 学生姓名,gender ENUM(男, 女) NOT NULL COMMENT 性别,class VARCHAR(50) NOT NULL COMMENT 班级,registration_date DATE CO…

RabbitMQ实践——定制一致性Hash交换器的路由字段

大纲 Property法定制交换器绑定队列测试 Header法定制交换器绑定队列测试 代码工程参考资料 在《RabbitMQ实践——利用一致性Hash交换器做负载均衡》一文中&#xff0c;我们熟悉了一致性Hash交换器的使用方法。默认的&#xff0c;它使用Routing key来做Hash的判断源。但是有些时…

基于Python的数码产品销售平台

1 项目介绍 1.1 研究目的和意义 本研究旨在设计和实现一个基于Python的数码产品销售平台&#xff0c;其核心目的在于通过先进的技术手段&#xff0c;提升数码产品销售的效率和用户体验&#xff0c;进而推动数码产品市场的繁荣发展。通过利用Python这一强大且灵活的编程语言&a…

可的哥视频会议(Meeting): 开启智能云端会议新纪元!

随着远程办公和全球化协作需求的不断增长&#xff0c;企业亟需一种更高效、更便捷的会议解决方案。在这样的背景下&#xff0c;可的哥&#xff08;Codigger&#xff09;视频会议&#xff08;Meeting&#xff09;应运而生&#xff0c;为企业提供了全新的沟通与协作方式。 可的哥…

AUTOSAR以太网之IPv4

系列文章目录 返回总目录 文章目录 系列文章目录一、IPv4报文格式二、主要函数1.IPv4_Init()2.IPv4_Receive()3.IPv4_Transmit()一、IPv4报文格式 二、主要函数 1.IPv4_Init() 这个函数除了对模块配置进行初始化,如果有分包和组包使能,则会对一些相关配置进行初始化如buf长…

Codeforces Round 954 (Div. 3) A~F

A.X Axis&#xff08;暴力&#xff09; 题意&#xff1a; 在 X X X轴&#xff08; 1 ≤ x i ≤ 10 1\leq x_i\leq 10 1≤xi​≤10&#xff09;上有三个点&#xff0c;其整数坐标分别为 x 1 x_1 x1​、 x 2 x_2 x2​和 x 3 x_3 x3​。您可以选择 X X X轴上任何一个整数坐标为 …

免费恢复微信好友的聊天记录(已删除的好友不能恢复)

非常简单,适用于未删除的微信好友的聊天记录恢复,支持导出 1、下载楼月微信聊天记录导出恢复助手 - 导出手机微信聊天记录 2、官方原文教程链接&#xff1a;官方原文教程链接https://www.louyue.com/weixin.htm

高考填报志愿,要做到知己知彼兼顾平衡

寒窗苦读&#xff0c;无非就是希望能够考上一所理想的大学&#xff0c;不过自从高考改革以后&#xff0c;高考结束后只是第一阶段&#xff0c;接下来第二阶段应对高考填报志愿也同样重要。 如何选择合适的院校、专业&#xff0c;考生和家长都需要做好充足的准备&#xff0c;在收…

视频组合其他内容生成二维码的方法,多内容二维码的生成技巧

现在通过二维码来播放视频的使用场景越来越多&#xff0c;通过这种方式能够更加简单便捷的让用户获取内容&#xff0c;无需下载视频内容&#xff0c;有效提升用户的体验效果。那么在制作视频二维码时&#xff0c;怎么加入其他的内容呢&#xff0c;比如图片、文件、文本、音频等…

springboot校BA篮球网站-计算机毕业设计源码29210

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;校BA篮球网站当然也不能排除在外。校BA篮球网站是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#x…

【LeetCode】五、哈希表相关:统计重复元素 + 找不同

文章目录 1、哈希表结构2、Java中的哈希表3、leetcode217&#xff1a;统计重复元素4、leetcode389&#xff1a;找不同5、leetcode496&#xff1a;下一个更大元素 1、哈希表结构 又叫散列表&#xff0c;存键值对&#xff0c;将key用哈希函数转为数组下标索引 当两个不同的key经…

【代码安全】如何通过实现代码加密与魔改Python,防止代码泄露、恶意窃取

如何通过实现代码加密与魔改Python&#xff0c;防止代码泄露、恶意窃取 文章目录 如何通过实现代码加密与魔改Python&#xff0c;防止代码泄露、恶意窃取前言概述代码运行演示Step 0: 正常代码运行Step 1: 代码加密Step 2: 加密代码在魔改环境运行Step 3: 加密代码在正常环境运…

数字孪生如何赋能智慧加油站?

在当今数字化转型的浪潮中&#xff0c;智慧城市的构建正以前所未有的速度推进&#xff0c;而智慧加油站作为智慧城市生态系统的重要组成部分&#xff0c;其升级转型显得尤为重要。随着国家“十四五”规划对智慧城市和数字化建设的明确指引&#xff0c;以及“碳达峰、碳中和”目…

51WORLD发布电力行业输电网自动生成与GIM解析技术,引领智慧电网加速进化!

电力行业是国民经济发展的重要支柱性产业。近年来&#xff0c;5G、大数据、人工智能、数字孪生等新技术新应用的高速发展&#xff0c;数字化、智能化已成为传统电力行业转型发展的重要方向。 大趋势下&#xff0c;以智能电网等为代表的新业态、新模式、新技术蓬勃兴起&#xf…

PyTorch入门:探索Tensor的基本操作(2)

torch.cat&#xff08;&#xff09; a torch.zeros((2,4)) b torch.ones((2,4)) out torch.cat((a,b), dim1) print(out)运行结果如下&#xff1a; tensor([[0., 0., 0., 0., 1., 1., 1., 1.],[0., 0., 0., 0., 1., 1., 1., 1.]])torch.stack&#xff08;&#xff09;&…