使用阿里云OSS实现图片文件上传

news2024/11/26 3:29:12

说明:注册用户时,经常会用到上传头像。文件的上传/接收与一般文本数据不同。

一、创建Demo页面

先准备一个Demo页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图片上传</title>
</head>
<body>
    <form method="post" action="/upload" enctype="multipart/form-data">
        用户名:<input name="username" type="text" />
        头像:<input name="image" type="file"/>
        提交:<input type="submit" value="提交">
    </form>
</body>
</html>

在这里插入图片描述

需要注意,上传文件,页面端需要满足以下三个条件:

a. 表单上传框必须使用file类型且必须得有name属性

b. 表单的提交方式必须是post

c. 表单的enctype值必须是mutipart-form/data(多部件文件上传),不写,默认值(enctype=“application/x-www-form-urlencoded”),表示都是字符串上传

二、本地磁盘接收

UploadController类

    /**
     * 本地磁盘存储:将用户上场的图片放入本机磁盘上
     * @throws IOException
     */
    @PostMapping("/upload")
    public String uploadDemo(String username, MultipartFile image) throws IOException {
        // 用户名,作参照,无意义,去掉也行
        System.out.println(username);

        // 1.获取用户上场的文件名
        String filename = image.getOriginalFilename();

        // 优化:为了保证图片名称的唯一性 不会被多用户覆盖
        filename = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."));
        System.out.println(filename);

        // 2 输出到指定磁盘下
        image.transferTo(new File("D:\\imgTest\\" + filename));

        return "上传成功";
    }

测试,上传图片

在这里插入图片描述
在这里插入图片描述

本地D盘下存储了图片
在这里插入图片描述

需要记住以下几点:

a. 后端需要使用使用MutiPartFile对象接收图片;

b. 对象的属性名必须和页面提交的name一样

c. 默认接收的内容有大小限制,也自定义接收范围

(application.properties文件中配置)

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB

#配置单个请求最大上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

三、阿里云OSS接收

使用本地磁盘存储,存在以下缺点:

(1)不安全:磁盘如果损坏,所有的文件就会丢失

(2)容量有限:如果存储大量的图片,磁盘空间有限(磁盘不可能无限制扩容)

(3)无法直接访问:需要服务器开机才行

对此,我们可以选择自己搭建存储服务器,或者使用现成的云服务,比如阿里云的OSS(对象存储)。

以下介绍使用阿里云OSS接收客户端上传的文件

第一步:搜索OSS,点击管理控制台(登录或注册)

在这里插入图片描述

第二步:创建Bucket

在这里插入图片描述

第三步:设置Bucket名称和读写权限

读写权限设置为公共读,其他的都不需改动
在这里插入图片描述

第四步:添加依赖

可在SKD示例中找到,https://help.aliyun.com/document_detail/32009.html?spm=a2c4g.32008.0.0.5d2e3a3aX3TNv5
在这里插入图片描述

第五步:复制阿里云中提供的上传文件流的Demo代码

在Java对象/文件–>上传文件–>简单上传–>上传文件流里(https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.32011.0.i7)
在这里插入图片描述

第六步:创建AccessKey

在个人中心里点AcccessKey,进入后点创建AccessKey,创建完成后,会有“accessKeyId”、“accessKeySecret”,相当于访问Bucket的账号密码

在这里插入图片描述

第七步:修改对应的值

我这里以桌面上的test文件夹下的2.jpg为例上传
在这里插入图片描述

第八步:启动

在这里插入图片描述

可以看到,已经上传成功,图片中的url,在实际开发中作为用户头像字段的值存入数据库,以供前端使用

在这里插入图片描述

小结

阿里云官网提供的Demo,代码比较粗糙,可以将其精简,成为一个工具类。所需的配置,像数据库那样抽取出来,放在配置文件中,使用@ConfigurationProperties()注解,将配置值注入到对应的变量里,使用起来十分方便。

/**
 * 阿里云 OSS 工具类
 */
@Data
@Component
@ConfigurationProperties(prefix = "oss")
public class AliOSSUtils {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;


    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));

		// 增加文件结构,按年月日区分文件
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(new Date());

        fileName =  "image"+ "/" + date + "/" + fileName;

        //上传文件到 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();
        // 把上传到oss的路径返回
        System.out.println(url);
        return url;
    }

}

application.yml文件
在这里插入图片描述

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

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

相关文章

第三章 三段论:所有,有的。

第三章 三段论&#xff1a;所有&#xff0c;有的。 第一节 三段论-推结论 题-三段论-结构-推结论&#xff1a;所有A是B&#xff1b;所有B是C&#xff1b;得&#xff1a;所有A是C。&#xff08;最简单的模型&#xff09; 4.所有高明的管理者都懂得关心雇员福利的重要性&…

Linux目录结构(与window目录结构对比+绝对路径和相对路径)

一、Linux目录结构 Linux目录结构是一个标准化的文件系统层次结构&#xff0c;非常有组织性并且易于管理。而与Windows 操作系统不同&#xff0c;Linux将所有文件和设备都组织在一个单一的根目录下。以下是Linux的标准目录结构&#xff1a; /&#xff1a;根目录&#xff0c;包含…

<DB2>《DB2数据库健康检查》第3部分

《DB2数据库健康检查》第3部分 2 数据库对象检查2.12 检查是否需要对表和索引进行runstats(30天未作统计更新)2.13 检查表和索引是否需要重组2.14 查看表空间所在裸设备权限2.15 查看数据库备份进度 2 数据库对象检查 2.12 检查是否需要对表和索引进行runstats(30天未作统计更…

递归sql查询完整科目名称

已知表 科目编号 科目名称 1001 1001 现金 1002 1002 银行存款 10020100 0100 工商银行存款 100201000001 0001 工行重庆路支行 10020200 0200 建设银行存款 100202000001 0001 建行铁北支行 需要整理成 科目编号 科目称 科目全称 1001 现金 现金 1002 银行存款 银行存款 …

【OI学习笔记】基础算法-前缀和与差分算法

板块&#xff1a;基础算法、线性优化 难度&#xff1a;较易 前置知识&#xff1a;C基础语法 一、前缀和 1、定义 在一维空间中&#xff0c;对于一个数据总量为 n n n 的数组 a a a&#xff0c;有数据 a [ 1 ] , a [ 2 ] , a [ 3 ] , . . . , a [ n − 1 ] , a [ n ] a[1]…

计算数组中各元素的平方根numpy.sqrt()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算数组中各元素的平方根 numpy.sqrt() 选择题 以下程序的运行结果是? import numpy as np a np.array([1, 4, 9, -4]) print("【显示】a ", a) print("【执行】np.sqrt(a)&…

计网常见面试题

参考:小林coding 1.TCP/IP模型 2.说一下TCP的三次握手? 第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中包含标志位SYN=1,序列号seq=x。第一次握手前客户端的状态为CLOSE,第一次握手后客户端的状态为SYN-SENT。…

Stable Diffusion 从听说到超神日记(从安装开始)

1.安装模型&#xff08;B站搜秋叶&#xff09; 看到下面界面就成功了&#xff01; 下载好模型打开主页&#xff01;点击右下角一键启动&#xff01; 首先弹出下面命令界面。 自动弹出一个网页界面&#xff08;地址是http://127.0.0.1:7860/?__themelight&#xff09;&#xf…

Zabbix(二)

所有实验的zabbix_agent客户端都是web1(192.168.29.142) 模板Template 模板是可以方便地应用于多个主机的一组实体。 实体可以是&#xff1a; 监控项触发器图表仪表盘低级别自动发现规则web场景 模板通常用于为特定服务或应用程序&#xff08;如Apache&#xff0c;MySQL&am…

第二章 模态命题:必然、可能

第二章 模态命题&#xff1a;必然、可能 第一节 模态命题-句式转换-逻辑转换 题-模态命题-句式转换-逻辑转换&#xff1a;①不一定不可能&#xff1b;②不一定可能不未必。 1.唐代韩愈在《师说》中指出&#xff1a;“孔子曰&#xff1a;三人行&#xff0c;则必有我师。是故…

MM32F3273G8P火龙果开发板MindSDK开发教程1 - 点亮LED

MM32F3273G8P火龙果开发版MindSDK开发教程1-点亮LED 1、登录官网下载对应的MindSDK固件 https://mindsdk.mindmotion.com.cn/&#xff0c;然后注册下载mm32F3270的固件即可。 下载完的文件为 plus-f3270_mdk.zip 解压后的文件路径如图&#xff1a; 2、新建LED工程 将下载…

ModNet抠图算法及摄像头实时抠图示例

目录 一、视频抠图采用绿幕的原因 1、摄像机成色原因 2、抠图效果原因 3、经济成本 二、抠图背景知识 1、Trimap 2、什么是抠图 3、抠图算法分类 三、Deep Image Matting算法 1、网络结构图 2、算法解读 &#xff08;1&#xff09;Encoder-Decoder阶段 &#xff0…

vue3 -- lottie-web使用

Lottie简介 官方介绍:Lottie是一个库,可以解析使用AE制作的动画(需要用bodymovie导出为json格式),支持web、ios、android、flutter和react native。在web端,lottie-web库可以解析导出的动画json文件,并将其以svg或者canvas的方式将动画绘制在我们的页面上. Lottie的优点 …

chatgpt赋能python:Python版本切换教程

Python版本切换教程 Python是一种高级编程语言&#xff0c;用于多种编程任务。但是&#xff0c;由于Python版本之间的不兼容性&#xff0c;有时候需要切换Python版本以满足特定的需求。在本文中&#xff0c;我们将介绍Python版本切换的方法&#xff0c;包括安装和使用多个版本…

机器学习 | 集成算法 | Bagging | Boosting | 概念向

&#x1f4da;Bagging和Boosting的概念 集成学习&#xff08;Ensemble Learning&#xff09;就是通过某种策略将多个模型集成起来&#xff0c;通过群体决策来提高决策准确率。为什么集成学习会好于单个学习器呢&#xff1f;原因可能有三&#xff1a; 训练样本可能无法选择出最好…

【ARMv8 SIMD和浮点指令编程】NEON 通用算术指令——杂项也不少

算术通用指令杂项包括以下指令: UABA、UABAL/UABAL2、UABD 和 UABDL/UABDL2。无符号向量差值绝对值累加和差值绝对值。 ABS 和 NEG向量绝对值和求反。 UMAX、UMIN、UPMAX、UPMIN、UMAXV 和 UMINV。无符号向量最大值,无符号向量最小值,无符号向量按对最大值,无符号向量按对最…

chatgpt赋能python:Python怎么分行输出?教程来了!

Python怎么分行输出&#xff1f;教程来了&#xff01; Python是一种解释型、面向对象、动态数据类型的高级编程语言。在Python中&#xff0c;分行输出是非常常见的操作&#xff0c;本文将介绍Python分行输出的不同方式以及使用的情况。 一、使用换行符 使用换行符是Python分…

python文字转语音(pyttsx3+flask)

提示&#xff1a;文章结尾有全部代码 目录 前言一、Flaskpyttsx基本使用Flask导入Flask框架配置基础环境初始Flask代码 pyttsx3库基本使用导入pyttsx3初始化pyttsx3文字转语音运行 二、具体实现1.引入库 总结 前言 本文主要讲解如何用python的pyttsx3库flask框架&#xff0c;手…

chatgpt赋能python:Python切换指南:让你无缝转换到Python

Python切换指南&#xff1a;让你无缝转换到Python Python是一个高级的编程语言&#xff0c;它可以用来进行各种各样的应用开发和数据分析。 Python有很多优点&#xff0c;比如它易于学习和使用&#xff0c;它是一个开源的语言&#xff0c;它具有广泛的库和框架。 如果你是处于…

Mysql数据库(六):基本的SELECT语句

基本的SELECT语句 前言一、SELECT...二、SELECT ... FROM三、列的别名四、去除重复行五、空值参与运算六、着重号七、查询常数八、显示表结构九、过滤数据 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#…