当前位置: 首页 > news >正文

使用阿里云的oss对象存储服务实现图片上传(前端vue后端java详解)

一:前期准备:

1.1:注册阿里云账号,开启对象存储oss功能,创建一个bucket(百度教程多的是,跟着创建一个就行,创建时注意存储类型是标准存储,读写权限是公共读)

二:后端设置:

2.1:引入依赖:

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>
</dependency>

2.2:在application.yml中配置一些必要的属性,并写一个类读取出来(我是这样使用的,将某些特定的数据都写到application.yml文件中,方便更改,当然你也可以直接将他写在类的代码中,只不过找起来可能麻烦点)

bookstore:alioss:endpoint: xxxxx #外网访问的地域节点access-key-id: xxxxxx #访问阿里云api的秘钥access-key-secret: xxxxxxx #访问阿里云api的秘钥bucket-name: xxxxxxxx #bucket-name//写在application.yml文件中,这些数据在阿里云中可以找到,秘钥在自己的账号主页里创建生成,地域节点和bucket-name都在创建好bucket后查看

读取配置中的数据 

package com.bookstore.common.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "bookstore.alioss")
@Data
public class AliOssProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}//读取配置里的相关数据

2.3:封装一个上传图片的工具类,阿里云已经给出了具体代码,没有什么需要修改的内容,直接cv大法就行

package com.bookstore.common.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;import java.io.ByteArrayInputStream;@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** @param bytes* @param objectName* @return*/public String upload(byte[] bytes, String objectName) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 创建PutObject请求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} 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();}}//文件访问路径规则 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上传到:{}", stringBuilder.toString());return stringBuilder.toString();}
}

2.4:写配置类,这个类是来创建AliOssUtil对象并注入到springboot中,就是实例化我们上面封装的那个工具类并将我们上面写的从配置中读取数据的类传进去,最后返回URL路径,它也没有什么需要更改的,cv就行

package com.bookstore.config;import com.bookstore.common.properties.AliOssProperties;
import com.bookstore.common.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 配置类,用于创建AliOssUtil对象*/
@Configuration
@Slf4j
public class OssConfiguration {@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}

2.5:写一个通用接口,后端上传图片调的就是这个接口,上传一个图片,最后返回文件路径

package com.bookstore.controller.admin;import com.bookstore.common.constant.MessageConstant;
import com.bookstore.common.result.Result;
import com.bookstore.common.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.UUID;/*** 通用接口*/
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上传")public Result<String> upload(MultipartFile file){log.info("文件上传:{}",file);try {//原始文件名String originalFilename = file.getOriginalFilename();//截取原始文件名的后缀.png .jpgString extension = originalFilename.substring(originalFilename.lastIndexOf("."));//构造新文件名称String objectName = UUID.randomUUID().toString() + extension;//文件的请求路径String filePath = aliOssUtil.upload(file.getBytes(), objectName);return Result.success(filePath);} catch (IOException e) {log.error("文件上传失败:{}",e);}return Result.error(MessageConstant.UPLOAD_FAILED);}
}

 三:前端怎么写:

前端我使用的是vue框架,代码如下

3.1:模板组件:

<el-form-item label="图片" prop="image"><el-uploadclass="upload-demo"action="http://localhost:8082/admin/common/upload"method="post":headers="{token: token,}":on-success="handleUploadSuccess":show-file-list="false"list-type="picture-card"><imgv-if="previewImage":src="previewImage"style="width: 100%; height: 100%"/><i class="el-icon-plus avatar-uploader-icon" v-else></i></el-upload></el-form-item>
3.1.1:代码解释: 

 action:这里写的是我们上面的那个通用接口路径

method:使用post(后端就是使用的post方法)

:headers:这里用来设置请求头,我在请求头上添加了一个token用来校验用户

:on-success:这里是上传成功的回调函数

:show-file-list:设置是否显示文件列表

list-type="picture-card":设置上传文件列表的样式为图片卡片形式。图片卡片形式可以让用户更直观地看到上传的图片,并且可以方便地进行删除或替换操作。

下面的img组件和i标签组件我使用了v-if和v-else来显示上传成功后的样子(是上传之前的图标还是上传成功后的图片回显)

3.2:script的data里写:

data(){return{token: "",  //请求头previewImage: "", // 图片回显}
}

 3.3:script的方法中写好图片上传成功后的回调函数

handleUploadSuccess(response) {// 图片上传成功后的回调函数console.log(response.data);this.previewImage = response.data; // 设置图片回显},

四:运行效果:

4.1:上传图片之前:

4.2:上传图片后: 

4.3:后端控制台打印消息提示:

可以看到,运行成功,一切正常,而且我们的bucket里也是正常有图片的

 

相关文章:

使用阿里云的oss对象存储服务实现图片上传(前端vue后端java详解)

一&#xff1a;前期准备&#xff1a; 1.1&#xff1a;注册阿里云账号&#xff0c;开启对象存储oss功能&#xff0c;创建一个bucket&#xff08;百度教程多的是&#xff0c;跟着创建一个就行&#xff0c;创建时注意存储类型是标准存储&#xff0c;读写权限是公共读&#xff09;…...

python实例100第32例:使用a[::-1]按相反的顺序输出列表的值

题目&#xff1a;按相反的顺序输出列表的值。 程序分析&#xff1a; a[n:-n]作用是去除前n个元素和末n个元素a[-n]作用是取倒数第n个元素a[:-n]的作用是去除后n个元素a[:&#xff1a;-1]的作用是将所有元素逆序排列a[n:&#xff1a;-1] 的作用是从第n个元素截取后逆序排列 程序…...

python执行脚本的时候获取输入参数

当我们执行脚本的时候&#xff0c;通常都会执行 python test.py -i xxx -o xxx&#xff0c;这里的 -i 和 -o 都是输入参数&#xff0c;这到底是怎么传递的呢&#xff1f; 本文纯粹记录一下 import argparseif __name__ __main__:print("hello")# 创建AugumentParser…...

Halcon指定区域的形状匹配

Halcon指定区域的形状匹配 文章目录 Halcon指定区域的形状匹配1.在参考图像中选择目标2.创建模板3.搜索目标 在这个实例中&#xff0c;会介绍如何根据选定的ROI选择合适的图像金字塔参数&#xff0c;创建包含这个区域的形状模板&#xff0c;并进行精确的基于形状模板的匹配。最…...

Linux——常用命令

1、命令的基本格式 对服务器来讲&#xff0c;图形界面会占用更多的系统资源&#xff0c;而且会安装更多的服务、开放更多的端口&#xff0c;这对服务器的稳定性和安全性都有负面影响。其实&#xff0c;服务器是一个连显示器都没有的家伙&#xff0c;要图形界面干什么&#xff…...

外包干了2个月,技术反而退步了...

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

洛谷C++简单题练习day6—P1830 城市轰炸

day6--P1830 城市轰炸--1.26 习题概述 题目背景 一个大小为 nm 的城市遭到了 x 次轰炸&#xff0c;每次都炸了一个每条边都与边界平行的矩形。 题目描述 在轰炸后&#xff0c;有 y 个关键点&#xff0c;指挥官想知道&#xff0c;它们有没有受到过轰炸&#xff0c;如果有&a…...

【linux-interconnect】What NVIDIA MLNX_OFED is?

NVIDIA MLNX_OFED Documentation v23.07 - NVIDIA Docs 文章目录 What NVIDIA MLNX_OFED is&#xff1f;Overview[Software Download](https://docs.nvidia.com/networking/display/mlnxofedv23070512#src-2396583107_NVIDIAMLNX_OFEDDocumentationv23.07-SoftwareDownload) Wh…...

Unity开发中的XML注释

在Unity开发中&#xff0c;XML注释主要用于C#脚本的注释&#xff0c;以帮助生成代码文档和提供IntelliSense功能。以下是一些关于如何使用XML注释的技巧&#xff1a; 创建注释&#xff1a; 在C#中&#xff0c;XML注释是由///或/**...*/开始的。例如 /// <summary> /// 这…...

[MQ]常用的mq产品图形管理web界面或客户端

一、MQ介绍 1.1 定义 MQ全称为Message Queue&#xff0c;消息队列是应用程序和应用程序之间的通信方法。 如果非要用一个定义来概括只能是抽象出来一些概念&#xff0c;概括为跨服务之间传递信息的软件。 1.2 MQ产品 较为成熟的MQ产品&#xff1a;IBMMQ&#xff08;IBM We…...

JWT令牌(JSON Web Token)

目录 1 前言 2 JWT令牌的组成 3 使用步骤举例 3.1 pom.xml中引入依赖 3.2 JWT生成 3.3 JWT验证 4 实践中的使用举例 4.1 拦截非法访问 4.1.1 编写为工具类 4.1.2 下发给用户 4.1.3 编写拦截器 4.1.4 注册拦截器 4.2 获取相关数据提升效率 1 前言 在我们编写的后端…...

华硕ASUS K43SD笔记本安装win7X64(ventoy为入口以支撑一盘多系统);友善之臂mini2440开发板学习

记录 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 1. MBR样式常规安装win7X64Sp1 (华硕 K43SD 安装 win7X64 ) 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 (常规安装) 设置: 禁用UEFI 启用AHCI ventoy制作MBR(非UEFI)方式的启动U盘 U盘中放cn_windows_7_ultimate_wit…...

npm设置源(原淘宝源域名已过期)

今天打包机器报错&#xff0c; Couldnt find package "antd-mobile2.3.4" required by "neo-ui-mf-base1.0.41" on the "npm" registry. 找不到antd mobile的包&#xff0c;查看源发现淘宝域名npm.taobao.org 和 registry.npm.taobao.org 域名…...

操作系统-进程通信(共享存储 消息传递 管道通信 读写管道的条件)

文章目录 什么是进程通信为什么进程通信需要操作系统支持共享存储消息传递直接通信方式间接通信方式 管道通信小结注意 什么是进程通信 分享吃瓜文涉及到了进程通信 进程通信需要操作系统支持 为什么进程通信需要操作系统支持 进程不能访问非本进程的空间 当进程P和Q需要…...

NODE笔记 2 使用node操作飞书多维表格

前面简单介绍了node与简单的应用&#xff0c;本文通过结合飞书官方文档 使用node对飞书多维表格进行简单的操作&#xff08;获取token 查询多维表格recordid&#xff0c;删除多行数据&#xff0c;新增数据&#xff09; 文章目录 前言 前两篇文章对node做了简单的介绍&#xff…...

Scikit-Learn 高级教程——自定义评估器

Python Scikit-Learn 高级教程&#xff1a;自定义评估器 Scikit-Learn 提供了许多内置的评估器&#xff08;Estimator&#xff09;来进行机器学习任务&#xff0c;但在某些情况下&#xff0c;我们可能需要自定义评估器以满足特定需求。本篇博客将深入介绍如何在 Scikit-Learn …...

6 时间序列(不同位置的装置如何建模): GRU+Embedding

很多算法比赛经常会遇到不同的物体产生同含义的时间序列信息&#xff0c;比如不同位置的时间序列信息&#xff0c;风力发电、充电桩用电。经常会遇到该如此场景&#xff0c;对所有数据做统一处理喂给模型&#xff0c;模型很难学到区分信息&#xff0c;因此设计如果对不同位置的…...

Git 基本概念

Git是一种版本控制系统&#xff0c;用于跟踪文件的更改并协同开发代码。它具有以下基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git将文件存储在仓库中&#xff0c;它是保存项目历史记录和更改的地方。一个项目通常有一个主要的仓库。 …...

android:excludeFromRecents

android:excludeFromRecents 基础从根上影响 TaskexcludeFromRecents 属性可能会影响系统 基础 android:excludeFromRecents是一种在Android应用程序清单文件&#xff08;AndroidManifest.xml&#xff09;中使用的属性&#xff0c;用于指定一个Activity是否应该在最近任务列表…...

微信小程序登录获取手机号教程(超详细)

1. 背景介绍&#xff1a; 在我们开发微信小程序时&#xff0c;登录时&#xff0c;需要获取用户手机号作为唯一标识&#xff0c;下面我介绍一下获取手机号的教程。 本篇文章介绍后端获取方法&#xff1a; 前端工作 后端工作 前端 新建Page页面&#xff0c;在xxx.wxml中加入…...

uniapp app更新

uniapp app更新 这个版本要随之增加&#xff0c;不然刚更新时直接用app, 新包增加的那些页面跳转会有问题&#xff0c;不能跳新的页面 //app更新检测 updataApp(){const that this;uni.showLoading({title:加载中...})plus.runtime.getProperty(plus.runtime.appid, functio…...

C语言第八弹---一维数组

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 一维数组 1、数组的概念 2、⼀维数组的创建和初始化 2.1、数组创建 2.2、数组的初始化 2.3、数组的类型 3、⼀维数组的使用 3.1、数组下标 3.2、数组元素…...

科普栏目 | 水离子水壁炉是如何打造清新环境,提升居家生活?

现代生活中&#xff0c;人们对于居家环境的品质有着越来越高的要求。水离子水壁炉作为一种创新科技&#xff0c;通过其独特的功能&#xff0c;为居家生活带来了一系列的提升。 1.采用先进的技术&#xff0c;减少了对传统能源的依赖&#xff0c;让我们在提高生活品质的同时&…...

python 进程

1创建一个爬虫程序 import requests urls [https://www.cnblogs.com/#p{page}for page in range(1, 501) ]def craw(url):r requests.get(url)print(url, len(r.text))craw(urls[0])2定义单进程和多进程 import blob_spider import threading import timedef single_thread…...

网络编程套接字(1)

网络编程基础 为什么需要网络编程? --丰富的网络资源 用户在浏览器中,打开在线视频网站,如优酷看视频,实质通过网络,获取到网络上的一个视频资源 与本地打开视频文件类似,只是视频文件这个资源的来源是网络. 相比于本地资源来说,网络提供了更为丰富的网络资源: 所谓的网络…...

harmonyOS app 开发环境配置流程

1.安装DevEco Studio&#xff0c;注意nodejs版本&#xff0c;安装过程中有提示&#xff0c;添加hdc到系统环境变量中&#xff0c;用于调用hdc命令 2.开启真机设备的开发人员选项&#xff0c;以及开启5555端口&#xff08;需要连接usb线&#xff09; https://developer.harmonyo…...

【嵌入式学习】C++QT-Day2-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度…...

新手基础易懂的创建javaweb项目的方法(适用于IDEA 2023版)

新手基础易懂的创建javaweb项目的方法 前言我的IDEA版本新建项目步骤1步骤2步骤3步骤4步骤5步骤6<font colorred>特别注意&#xff0c;一定要注意步骤7步骤8 配置Tomcat服务器步骤9步骤10步骤11步骤12步骤13修改前修改后 步骤14 点击修复修改前修改后 试运行 前言 创建ja…...

决策树的基本构建流程

决策树的基本构建流程 决策树的本质是挖掘有效的分类规则&#xff0c;然后以树的形式呈现。 这里有两个重点&#xff1a; 有效的分类规则&#xff1b;树的形式。 有效的分类规则&#xff1a;叶子节点纯度越高越好&#xff0c;就像我们分红豆和黄豆一样&#xff0c;我们当然…...

[极客大挑战 2019]Upload1

直接上传php一句话木马&#xff0c;提示要上传image 把文件名改成gif并加上gif文件头后&#xff0c;绕过了对image类型的检测&#xff0c;但是提示文件内含有<?&#xff0c;且bp抓包后改回php也会被检测 那我们考虑使用js执行php代码 <script languagephp>eval($_PO…...

青浦企业网站制作/会员营销

border :基本语法border: border-width || border-style || border-color 默认值为&#xff1a; medium none 。 border-color 的默认值将采用文本颜色相关属性&#xff1a;border-top,border-left,border-right,border-bottom:它们分别对边框的某个方向起作用&#xff0c;语法…...

做网站可以用什么软件/优化关键词排名外包

&#xff08;前提要求都是把第二个页面的只传给第一个页面&#xff09; 1.代理 一对一 在第二个页面设置代理 1.1在最上方设置 //选择房间的代理 protocol RoomVCDelegate <NSObject> 1.2设置代理方法 // 方法 -(void)selectRoomName:(NSString *)name; 1.3定…...

关于做网站的笑话/自己怎么做网页

链接: https://blog.csdn.net/ZCShouCSDN/article/details/84375260转载于:https://www.cnblogs.com/hgstudy/p/11024468.html...

限制访问次数的网站/什么软件可以免费发广告

实用标准Oracle BIEE 12c 系统安装配置文档仇辉2015 年 12 月文案大全实用标准1 文档控制编制日期 作者 版本 变更参考2015-12-18 仇辉 V1.02015-12-18 V2.0审核职位发布位置 / 岗位项目指导委员会项目指导委员会项目指导委员会项目指导委员会文案大全实用标准目 录1 文档控制 …...

手机上做ppt的软件/南通seo

--drop语句用来删除表&#xff0c;注意&#xff1a;删除的时候表和结构都会被清除掉 DROP TABLE tb_emp;--使用alter table语句可以修改表的结构 --修改列类型 【alter table 表名 MODIFY 列名 类型】 ALTER TABLE tb_emp MODIFY COMM VARCHAR(30); --将COMM表的数据类型修改为…...

网站建设的原则有哪些方面/百度竞价培训

此文转载自&#xff1a;https://blog.csdn.net/ChameleonTeam/article/details/110137463目录序言0.小程序开发模式1.业务开发面临的痛点问题2.如何解决业务上的痛点问题&#xff1f;3.解决场景构造难4.解决编译耗时长5.总结 序言自2016年小程序诞生以来&#xff0c;小程序以其…...