SpringBoot文件上传-阿里云OSS

news2025/3/1 13:59:01

1.打开阿里云

说明:登录阿里云账号

2.点击AccessKey管理

 3.创建AccessKey

说明:记得复制accessKeyId,accessKeySecret并保存起来

4. 点击对象存储OSS

5.创建Bucket

说明:创建储存桶 

 

6.查看SDK示例

 7.Java简单上传

8.上传文件流

说明:以上传图片为例

 9.copy代码

说明:由于新版要配置环境变量(为了安全),因此修改官方了代码.

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "D:\\localpath\\examplefile.txt";

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

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            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.itheima;

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.FileInputStream;
import java.io.InputStream;
@Component
public class Demo {
@Value("${accessKeyId}")
    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "******";
        String accessKeyId="*****";
        String accessKeySecret="******";
        
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "web-forever";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "1.jpg";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "C:\\Users\\Lenovo\\Desktop\\cStudy\\logo.png";

        // 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            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();
            }
        }
    }
} 

 10.endpoint

11.工具类

说明:创建工具类文件节utils

 

 12.编写工具类

package com.itheima.controller.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
@Component
public class AliOSSUtils {
//    value注入外部属性
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;
    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId ;
    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret ;
    @Value("${aliyun.oss.bucketName}")
    private String bucketName ;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();
        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

13.配置application.properties

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456
#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true
#配置上传文件的大小限制
spring.servlet.multipart.max-file-size=10MB
#配置单个请求的最大 大小的限制(一次请求中是可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
#自定义的阿里云OSS配置信息

aliyun.oss.endpoint=****************
aliyun.oss.accessKeyId=****************
aliyun.oss.accessKeySecret=****************
aliyun.oss.bucketName=****************

14.控制类

 说明:编写UploadController类 

package com.itheima.controller;

import com.itheima.controller.utils.AliOSSUtils;
import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Slf4j
@RestController
public class UploadController {
    @Autowired
   private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        log.info("文件上传,文件名:{}", image.getOriginalFilename());
//        调用阿里云工具类
      String url=aliOSSUtils.upload(image);
      log.info("文件上传成功,文件访问的url:{}",url);
      return  Result.success(url);
    }
}

15.启动类

16.测试

 

 

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

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

相关文章

已解决 AttributeError: ‘str‘ object has no attribute ‘decode‘

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂&#x1f996…

相对论的应用:GPS导航

“但是数学享有盛誉还有另一个原因:正是数学为精确的自然科学提供了一定程度的安全保障,而没有数学,它们就无法实现这一点。” “就现实而言,数学定律是不确定的;就其确定而言,它们并不涉及现实。” —阿尔…

Mysql高级——索引优化和查询优化(1)

索引优化 1. 数据准备 学员表插50万条, 班级表插1万条。 建表 CREATE TABLE class (id INT ( 11 ) NOT NULL AUTO_INCREMENT,className VARCHAR ( 30 ) DEFAULT NULL,address VARCHAR ( 40 ) DEFAULT NULL,monitor INT NULL,PRIMARY KEY ( id ) ) ENGINE INNO…

解决Win11/10中Edge浏览器页面加载不出来、打不开问题|有网但是打不开,加载不了

问题症状 edge浏览器打不开,有网络能正常上网,但是edge浏览器无法浏览。网络质量很高,但是页面就是加载不出来,详情如下: (我是在科学上网后造成这样子的原因,现在将我的方法分享一下&#xff…

Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求

文章目录 9 图片社交网站9.1 项目组织架构9.2 编写程序骨架9.3 高级用户认证9.4 基于用户角色的权限管理9.5 使用Flask-Dropzone优化文件上传9.6 使用Flask-Avatars处理用户头像9.7 图片展示与管理9.8 收藏图片9.9 用户关注9.10 消息提醒9.11用户资料与账户设置9.12 首页与探索…

近万采集各种典故网站文章大全ACCESS\EXCEL数据库

一个学语文的朋友问我有没有关于各种典故以及万物由来的数据,我看了看手头的资料发现还真没有,而且网上似乎也没有这一类的成品,因此就用程序采集了一个典故网的文章。 分类统计情况有:成语典故(共4198条)、…

第三、四、五场面试

第三场 共享屏幕做题(三道简单题) 替换空格成%20(双指针) 删除升序链表中的重复元素(指针)有效的括号(栈) 第四场、第五场 自我介绍 项目拷打 整个项目架构rpc模块的情况分析的数…

【UE 粒子练习】01——练习前的准备

步骤 1. 首先在虚幻商城中搜索如下资产然后创建工程 2. 打开新建的示例工程然后新建一个空白关卡 3. 将“BP_DemoRoom”拖入视口 这里设置“Base Room Size”为5 移入“BP_DemoDisplay” 这里“Description”设置为“Standard Sprite Emitter” 通过快捷键Alt来快速复制一份“…

FireFly PowerBASIC RAD编程,调用PowerBASIC COM对象

一、序言 初步看了看PowerBASIC编程,很类似用VC注册窗体后调用回调函数,先是一个Dialog new,然后添加组件 Control add ......, 然后在处理 Windows MSG和发给组件的消息,这种编程方式和早期DOS 25x80屏幕上编程一样&…

UWB学习——day5

旁瓣的控制 在UWB(Ultra-Wideband,超宽带)通信系统中,对主瓣和旁瓣进行控制和优化是重要的,因为这直接影响了信号的传输质量、抗干扰性和系统性能。 旁瓣出现的原因 频谱泄露,根据傅里叶变换原理&#x…

uniapp实时获取当前位置

首先我们需要先下载一个插件(高德地图官网插件) (插件主要作用是获取当前地理定位或者是自身的位置,并且可以返回名称name) 相关下载-微信小程序插件 | 高德地图API (amap.com)https://developer.amap.com/api/wx/do…

旅游出行类APP如何找到策略优势,最大化流量红利

刚刚结束了暑期出游,中秋国庆小长假马上到啦,出行计划又要安排起来了!多样化的出行方式为大家旅行带来极大的便利,同时,伴随互联网模式的深化发展,各式各样的旅游出行类APP已经成长为旅行用户所依赖的一类工…

【LeetCode热题100】--128. 最长连续序列

128.最长连续序列 先对数组进行排序,不断尝试x1,x2,…是否存在,不断枚举并更新答案 class Solution {public int longestConsecutive(int[] nums) {if (nums null || nums.length 0){return 0;}Arrays.sort(nums);int maxLength 1,current 1;for(in…

LVM分区空间扩充

老早之前自己整理的,今天有同事问起,再整理一下发出来。 LVM的全称为Logical Volume Manager,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活…

MySQL: 锁

一、table CREATE TABLE dog (id int(11) NOT NULL AUTO_INCREMENT,age int(11) DEFAULT NULL,weight int(11) DEFAULT NULL,PRIMARY KEY (id),KEY idx_age (age) ) ENGINEInnoDB AUTO_INCREMENT51 DEFAULT CHARSETutf8二、插入数据: 三、主键上锁的测试&#xff…

C++中的四种类型转换运算符

隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。 再者,C风格的强制类型转换统一使用( ),…

linux上mysql数据备份(全量备份策略+增量备份策略)

执行备份策略前,先做好scp命令的准备 解决思路: 生成SSH公钥/私钥后,您需要将公钥添加到服务器上,从而使服务器可以使用该公钥来验证您的身份。 生成SSH公钥/私钥的命令为 ssh-keygen -t rsa -b 4096什么都不用输入&#xff0c…

用于无功补偿的固定电容晶闸管控制反应器研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

已解决 (org.springframework.beans.factory.BeanCreationException)

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂&#x1f996…

vue模板语法(下集)

事件处理器 Vue模板语法中的事件处理器是指在Vue组件中绑定DOM事件,当事件发生时执行相应的方法或表达式。常见的事件包括点击事件click、输入事件input、鼠标移入事件mouseover等等。 事件监听可以使用v-on 指令 2.1 事件修饰符 .Vue通过由点(.)表示的指令后缀来调…