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

将图片存储至阿里云 OSS

将图片存储至阿里云 OSS

一、概述

在项目开发中,我们常常需要处理用户上传的图片。本文将介绍如何使用前端的 el-upload 组件将照片上传到后端,后端再将照片存储到阿里云 OSS,并最终返回图片的 URL 给前端。

二、前端实现

1. 安装依赖

确保项目中已经安装了 Element UI,如果未安装,可以使用以下命令进行安装:

npm install element-ui

2. 使用 el-upload 组件

在前端页面中,使用 el-upload 组件来实现图片上传功能。以下是一个简单的示例:

<template><div><el-uploadclass="upload-demo"action="your-backend-upload-api"  // 后端接收上传图片的接口地址:headers="headers":on-success="handleUploadSuccess":on-error="handleUploadError":before-upload="beforeUpload"accept="image/*"list-type="picture"><el-button type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传图片文件</div></el-upload></div>
</template><script>
export default {data() {return {headers: {'Authorization': 'Bearer ' + localStorage.getItem('token')  // 如果需要携带认证信息}};},methods: {// 上传成功后的回调handleUploadSuccess(response, file, fileList) {if (response.code === 200) {this.$message.success('上传成功');// response.data.url 是后端返回的图片 URLconsole.log('图片 URL:', response.data.url);} else {this.$message.error('上传失败');}},// 上传失败的回调handleUploadError(err, file, fileList) {this.$message.error('上传失败');},// 上传前的钩子函数,可以用来验证文件类型等beforeUpload(file) {const isImage = file.type.startsWith('image/');if (!isImage) {this.$message.error('只能上传图片文件');}return isImage;}}
};
</script>

三、后端实现(Java)

1. 添加依赖

在项目的 pom.xml 文件中添加阿里云 OSS 的 SDK 依赖:

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>  <!-- 请根据实际情况选择合适的版本 -->
</dependency>

2. 配置阿里云 OSS

创建一个配置类来配置阿里云 OSS 的客户端:

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OSSConfig {@Value("${aliyun.oss.endpoint}")private String endpoint;@Value("${aliyun.oss.accessKeyId}")private String accessKeyId;@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret;@Beanpublic OSS ossClient() {return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);}
}

application.ymlapplication.properties 文件中添加阿里云 OSS 的配置信息:

aliyun:oss:endpoint: your-oss-endpoint  # 阿里云 OSS 的 endpointaccessKeyId: your-access-key-id  # 阿里云的访问密钥 IDaccessKeySecret: your-access-key-secret  # 阿里云的访问密钥 Secret

3. 创建上传控制器

创建一个控制器来处理前端上传的图片,并将其存储到阿里云 OSS:

import com.aliyun.oss.OSS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;
import java.util.UUID;@RestController
@RequestMapping("/upload")
public class UploadController {@Autowiredprivate OSS ossClient;@Value("${aliyun.oss.bucketName}")private String bucketName;@PostMapping("/image")public ResponseEntity<?> uploadImage(@RequestParam("file") MultipartFile file) {try {// 检查文件是否为空if (file.isEmpty()) {return ResponseEntity.badRequest().body("上传的文件为空");}// 获取文件名和后缀String originalFilename = file.getOriginalFilename();String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成唯一的文件名,避免文件名重复String newFileName = UUID.randomUUID().toString() + fileExtension;// 获取输入流InputStream inputStream = file.getInputStream();// 上传文件至 OSSossClient.putObject(bucketName, newFileName, inputStream);// 关闭输入流inputStream.close();// 获取文件的 URLString url = ossClient.presignUrl(bucketName, newFileName, 3600 * 1000 * 24 * 365);  // 设置 URL 的过期时间为 1 年return ResponseEntity.ok().body(url);} catch (Exception e) {e.printStackTrace();return ResponseEntity.internalServerError().body("上传失败:" + e.getMessage());}}
}

四、注意事项

  1. 安全性:在实际项目中,需要对上传的文件进行严格的验证,包括文件类型、文件大小等,以防止恶意文件上传。

  2. 错误处理:在后端代码中,需要完善错误处理逻辑,确保在出现异常时能够正确地返回错误信息给前端。

  3. 性能优化:对于高并发的场景,可以考虑对 OSS 的上传操作进行异步处理,以提高系统的响应速度。

  4. 配置管理:将阿里云 OSS 的配置信息(如 endpoint、accessKeyId、accessKeySecret 等)放到配置文件中,并在生产环境中通过环境变量等方式进行管理,避免硬编码。

通过以上步骤,我们就可以实现前端通过 el-upload 上传照片到后端,后端再将照片存储到阿里云 OSS,并返回图片的 URL 给前端的功能。

相关文章:

将图片存储至阿里云 OSS

将图片存储至阿里云 OSS 一、概述 在项目开发中&#xff0c;我们常常需要处理用户上传的图片。本文将介绍如何使用前端的 el-upload 组件将照片上传到后端&#xff0c;后端再将照片存储到阿里云 OSS&#xff0c;并最终返回图片的 URL 给前端。 二、前端实现 1. 安装依赖 确…...

Android设备是如何进入休眠的呢?

首先我们手机灭屏后&#xff0c;一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候&#xff0c;并不是立即就进入了休眠模式&#xff1b;当所有唤醒源都处于de-avtive状态后&#xff0c;系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短&…...

ctfshow做题笔记—栈溢出—pwn65~pwn68

目录 前言 一、pwn65(你是一个好人) 二、pwn66(简单的shellcode&#xff1f;不对劲&#xff0c;十分得有十二分的不对劲) 三、pwn67(32bit nop sled)&#xff08;确实不会&#xff09; 四、pwn68(64bit nop sled) 前言 做起来比较吃力哈哈&#xff0c;自己还是太菜了&…...

高效处理 List<T> 集合:更新、查找与优化技巧

引言 在日常开发中,List<T> 是我们最常用的数据结构之一。无论是批量更新数据、查找特定项还是进行复杂的集合操作,掌握 List<T> 的高级用法可以显著提高代码的效率和可读性。本文将详细介绍如何使用 List<T> 进行批量更新、查找匹配项以及优化性能的方法…...

Java基础系列:深入解析final与static关键字的奥秘与避坑指南

目录 一、final关键字的四重境界 1. 修饰常量&#xff08;成员变量/局部变量&#xff09; 2. 修饰方法&#xff08;禁止重写&#xff09; 3. 修饰类&#xff08;禁止继承&#xff09; 4. 并发控制&#xff08;内存屏障&#xff09; 二、static关键字的四维空间 1. 静态变…...

django各种mixin用法

在 Django 中,Mixin 是一种用于扩展类功能的设计模式。通过 Mixin,可以在不修改原有类的情况下,为其添加新的方法或属性。Django 中的 Mixin 广泛应用于视图(View)、表单(Form)、模型(Model)等组件中。以下是 Django 中常见 Mixin 的用法和示例: 一、视图(View)中的…...

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包&#xff08;closures&#xff09;被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量&#xff0c;即使外部函数已执行完毕&#xff0c;这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解&#xff0c;尤其在变量捕获和…...

Element使用

Element(美化网页&#xff09; ElementUI的使用注意事项&#xff1a; Element.ui的使用基于Vue环境&#xff0c;于是Element相关组件的使用必须放在Vue对象绑定的视图中去 ElementUI的JS库的引入必须放在vue.js库的后面 <!-- 引入样式 --><link rel"styleshee…...

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…...

AI视频生成工具清单(附网址与免费说明)

以下是一份详细的AI视频制作网站总结清单&#xff0c;包含免费/付费信息及核心功能说明&#xff1a; AI视频生成工具清单&#xff08;附网址与免费说明&#xff09; 1. Synthesia 网址&#xff1a;https://www.synthesia.io是否免费&#xff1a;免费试用&#xff08;生成视频…...

知识蒸馏综述Knowledge Distillation: A Survey解读

论文链接&#xff1a;Knowledge Distillation: A Survey 摘要&#xff1a;近年来&#xff0c;深度神经网络在工业界和学术界都取得了成功&#xff0c;尤其是在计算机视觉任务方面。深度学习的巨大成功主要归功于它能够扩展以对大规模数据进行编码&#xff0c;并且能够处理数十…...

第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)

客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…...

【C++】:STL详解 —— 红黑树封装map和set

目录 红黑树的源代码 正向迭代器的代码 反向迭代器的代码 set的模拟实现 map的模拟实现 红黑树的源代码 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…...

【QWEN】机器人控制器的控制周期越短精度越高吗

好的&#xff0c;用户问的是“机器人控制器的控制周期越短精度越高吗”。我需要根据提供的知识库内容来回答这个问题。首先&#xff0c;我得回忆一下知识库里的相关信息。 知识库里有几篇相关的文章。比如&#xff0c;[3]提到控制周期越短&#xff0c;控制性能的上限越高&…...

使用数据库和缓存的时候,是如何解决数据不一致的问题的?

1.缓存更新策略 1.1. 缓存旁路模式&#xff08;Cache Aside&#xff09; 在应用里负责管理缓存&#xff0c;读取时先查缓存&#xff0c;如果命中了则返回缓存&#xff0c;如果未命中就查询数据库&#xff0c;然后返回缓存&#xff0c;返回缓存的同时把数据给写入缓存中。更新…...

【c++】平移字符串

说明 实现字符串的左移与右移 示例代码 #include <iostream> #include <string> using namespace std;int main() {string str1 "12345";//左移2位string str2 str1.substr(2) str1.substr(0, 2);cout << str2 << endl;//右移2位&…...

基于Spring Boot的多级缓存架构实现

基于Spring Boot的多级缓存架构实现 以下是一个基于Spring Boot的多级缓存架构实现示例 多级缓存架构实现方案 1. 依赖配置&#xff08;pom.xml&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…...

为什么DDPG需要目标网络而A2C不需要?

在强化学习中&#xff0c;DDPG需要目标网络而A2C不需要的主要原因在于算法架构、更新方式和目标稳定性需求的差异&#xff1a; Q值估计的稳定性需求不同 DDPG的Critic网络需要估计状态-动作值函数 Q ( s , a ) Q(s,a) Q(s,a)&#xff0c;其目标值的计算涉及下一个状态的最大Q值…...

蓝桥杯 C++ b组 统计子矩阵深度解析

题目大意&#xff1a;给定一个 NM 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小11&#xff0c;最大NM) 满足子矩阵中所有数的和不超过给定的整数 K&#xff1f; 前言&#xff1a;这题很容易想到二维前缀和优化&#xff0c;然后枚举子矩阵&#xff0c;但这样时间复杂度为…...

YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及

YOLOv12 是“你只看一次”&#xff08;You Only Look Once, YOLO&#xff09;系列的最新版本&#xff0c;于 2025 年 2 月发布。它引入了注意力机制&#xff0c;提升了检测精度&#xff0c;同时保持了高效的实时性能。在保持速度的同时&#xff0c;显著提升了检测精度。例如&am…...

每天五分钟深度学习PyTorch:向更深的卷积神经网络挑战的ResNet

本文重点 ResNet大名鼎鼎,它是由何恺明团队设计的,它获取了2015年ImageNet冠军,它很好的解决了当神经网络层数过多出现的难以训练的问题,它创造性的设计了跳跃连接的方式,使得卷积神经网络的层数出现了大幅度提升,设置可以达到上千层,可以说resnet对于网络模型的设计具…...

C++11新特性 11.基于范围的for循环

一.简介 基本概念&#xff1a; 在 C 中&#xff0c;基于范围的 for 循环&#xff08;Range-based for loop&#xff09;是一种简化容器遍历的语法糖&#xff0c;适用于所有支持 begin() 和 end() 的容器&#xff08;如 vector、map、array 等&#xff09;。以下是其核心用法和…...

Linux搜索---locate

locate locate 是 Linux 系统中用于快速查找文件和目录的命令。它并非实时遍历文件系统&#xff0c;而是通过搜索预先建立的文件数据库来定位文件。该数据库由 updatedb 程序定期&#xff08;通常是每天&#xff09;更新&#xff0c;收录了系统中所有文件的路径信息&#xff0…...

c语言笔记 一维数组与二维数组

1.一维数组和二维数组名加1代表什么意思&#xff0c;偏移多少单位&#xff1f; 方法&#xff1a;1就是以数组的元素类型的字节为单位去偏移。 先看结论再代码验证&#xff1a; 一维数组名&#xff0b;1表示加一个整型单位的偏移量&#xff0c;也可以这么理解1就是以数组的元…...

认识Event Loop【1】

前言 这应该是一个系列文章&#xff0c;因为我觉得Event Loop&#xff08;事件循环&#xff09;是一件很抽象也很重要的一个机制。eventloop这个知识点处于非常杂糅的位置&#xff0c;和很多其他知识&#xff0c;如运行时、浏览器、渲染流程、数据结构、线程等等&#xff0c;也…...

《Linux栈破坏了,如何还原》

【栈破坏导读】栈破坏有了解过吗&#xff1f;何为栈破坏&#xff0c;栈破坏了&#xff0c;程序会立刻引发崩溃&#xff0c;我们通过gdb去调试coredump&#xff0c;栈被破坏的栈帧是没法被恢复的&#xff0c;这也给我们调试程序带来很大的困难&#xff0c;那如何还原栈破坏的第一…...

环形链表问题的探究与代码实现

在数据结构与算法的学习中&#xff0c;环形链表是一个经典的问题。它不仅考察对链表这种数据结构的理解&#xff0c;还涉及到指针操作和逻辑推理。本文将结合代码和图文&#xff0c;深入分析如何判断链表中是否有环以及如何找到环的入口点。 目录 一、判断链表中是否有环 …...

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…...

React:类组件(上)

kerwin老师我来了 类组件的创建 class组件&#xff0c;js里的类命名首字符大写&#xff0c;类里面包括构造函数&#xff0c;方法 组件类要继承React.Component才有效 必须包含render方法 import React from react class App extends React.Component{render() {return <…...