若依——实现oss图片存储(单个)

RuoYiPlus+Minio (OSS功能) 第四步,进行测试,回到文件管理,点击上传文件,进行测试。(我第一次测试有点卡,刷新了一下,文件也是上传了,第二次文件上传很顺利)。第三步,只需要修改三个地方,如下图所示。登录账户和密码在cmd窗口有,第一次应该是minioadmin,账户和密码都是。第六步,新建bucket,直接新建,输入名字即可完成创建。第一步,打开文件管理页面。第四步,运行成功后不要关闭cmd窗口,打开下面的网址。第二步,准备一个存放将来保存文件用的文件夹。第一步,下载minio.exe文件。第五步,创建AccessKey。 阅读详情
AI摘要

该博客记录了在Ruoyi框架下实现文件上传的过程。包括配置OSS,在ruoyi - admin - resources - application.yml和pom.xml添加相关内容;实现工具类AvatarUpLoadUtil;修改后端的domain、controller、ServiceImpl代码;修改前端的el组件、表单、方法及请求,确保前后端数据以'multipart/form - data'编码方式传输。

1.配置oss

步骤1:ruoyi-admin-resources-application.yml

模板如下

#oss配置 xxx你自己的对应信息
aliyun:
  oss:
    endpoint: https://oss-cn-hangzhou.aliyuncs.com  # 阿里云 OSS的endpoint
    accessKeyId:  xxxx # 阿里云 AccessKey ID
    accessKeySecret:  xxxxx # 阿里云 AccessKey Secret
    bucketName:   xxxxxxx # OSS存储桶名称
    fileUploadDir: xxxxxxxx # 上传文件保存的目录

步骤2:pom.xml添加依赖

ruoyi-admin\ruoyi-common\ (两个文件都要加)


        <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>

2.实现工具类

在ruoyi-common模块下utils添加工具类AvatarUpLoadUtil

我是用memberId加一些其他数据确保存储路径的唯一性,可以更改,但是byte[] fileBytes不能少,它是用来存储文件处理后的字符流

package com.ruoyi.common.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.*;

/**
 * 头像Oss服务调用
 */
@Log4j2
@Service
public class AvatarUpLoadUtil { // 上传文件到阿里云 OSS
    @Value("${aliyun.oss.endpoint}")
    public  String endpoint;

    @Value("${aliyun.oss.accessKeyId}")
    public  String accessKeyId;

    @Value("${aliyun.oss.accessKeySecret}")
    public  String accessKeySecret;

    @Value("${aliyun.oss.bucketName}")
    public  String bucketName;

    @Value("${aliyun.oss.fileUploadDir}")
    public  String fileUploadDir;

    //    图片上传
    public  String uploadFileToOSS(byte[] fileBytes, String memberId ,String avatar) throws IOException {
        // 创建 OSSClient 实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建字节流输入流
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileBytes);

            // 设置文件名,可以使用文本内容生成唯一文件名,避免重名
            String objectName = "memberAvatar/" + memberId.hashCode() + ".jpg";

            // 构造上传请求
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, byteArrayInputStream);



            // 上传文件
            ossClient.putObject(putObjectRequest);
            System.out.println("File uploaded successfully to OSS.");

            // 去掉 endpoint 中的 https:// 前缀,确保不会重复添加
            String fileUrl = "https://" + bucketName + "." + endpoint.replace("https://", "") + "/" + objectName;

            return fileUrl;

        } catch (Exception e) {
            e.printStackTrace();
            throw new IOException("Error uploading file to OSS: " + e.getMessage());
        } finally {
            // 关闭 OSSClient
            ossClient.shutdown();
        }
    }

}

3.修改后端代码

domain

添加存储类型MultipartFile的avatarFile,用于接收上传的文件,但不映射到数据库

controller

因为若依请求后面mapper和service层等都是使用信息整体进行操作,所以我就在controller对数据进行了拆开,然后统一,代替了 MemberInfo memberInfo

ps:有一点繁琐(害羞),应该可以简便一下的

因为要文件和其他数据一起发送使用的是multipart/form-data 编码方式,所以后端使用的是@RequestParam注解

multipart/form-data 是一种用于发送文件和其他数据的 HTTP 表单数据编码方式,而 @RequestParam 是 Spring MVC 中用于获取请求参数的注解。它们常常一起使用,尤其是在处理文件上传的场景中。

注意   修改不意味着必须修改头像就是说文件可能为空!!!!!!!

ServiceImpl

在return之前

1.处理文件变成字符流

2.将oss存储url路径替换本来错误的路径

ps:readAllBytes()只能Java 9及以上才能使用

 @Override
    public int insertMemberInfo(MemberInfo memberInfo)
    {
        if (memberInfo.getAvatarFile() != null && !memberInfo.getAvatarFile().isEmpty()) {
            // 上传头像文件并获取文件 URL

           try (InputStream inputStream = memberInfo.getAvatarFile().getInputStream()) {
                // 读取图片的字节数据
                byte[] fileBytes = inputStream.readAllBytes();

                // 调用上传方法
               String pictureUrl = avatarUploadUtil.uploadFileToOSS(fileBytes, memberInfo.getMemberId(),memberInfo.getPictureUrl());
               // 将文件 URL 存储到数据库中
               memberInfo.setPictureUrl(pictureUrl);
               System.out.println("头像上传成功");

            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("图片上传失败: " + e.getMessage(), e);
            }

        }

        return memberInfoMapper.insertMemberInfo(memberInfo);
    }

 Java 8 兼容代码(没有使用过,不确定,存档给未来的自己,应该没什么问题(思考))

try (InputStream inputStream = memberInfo.getAvatarFile().getInputStream()) {
    // 使用 ByteArrayOutputStream 来收集字节数据
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        byteArrayOutputStream.write(buffer, 0, bytesRead);
    }
    // 获取字节数组
    byte[] fileBytes = byteArrayOutputStream.toByteArray();
}

同上  修改操作  可能不动头像 需要判断

4.修改前端代码

思路:通过el-upload组件的on-change拿到文件临时的url地址和文件,然后再赋值给两个formdata表单中的pictureUrl和avatarFile变量,虽然刷新就消失了,但是这正是不点击提交按钮就不添加的效果嘛

el组件

表单

因为要上传文件,所以我用了formData

FormData 是一个浏览器原生的 API,专门用于构造可以提交到服务器的表单数据,特别适合处理包含二进制文件(如图片、视频等)的表单。

方法

1. beforeAvatarUpload

文件处理一下()

  /** 上传前的处理 */
    beforeAvatarUpload(file) {
        const isImage = file.type.startsWith("image/");
        const isLt80M = file.size / 1024 / 1024 < 80; // 限制文件大小为 80MB

        if (!isImage) {
          this.$message.error("上传的文件必须是图片格式!");
        }

        if (!isLt80M) {
          this.$message.error("上传的图片大小不能超过 80MB!");
        }

        if (this.avatarList.length >= 1) {
          this.$message.error("只允许上传一张图片!");
          return false; // 阻止上传
        }

        return isImage && isLt80M;
      },

2. handleAvatarChange()

拿到两个数据

 /** 图片变化时的处理函数 */
    handleAvatarChange(file) {
      // 使用 URL.createObjectURL 来创建本地 URL
      this.formData.pictureUrl = URL.createObjectURL(file.raw); // 获取本地图片 URL
      this.formData.avatarFile = file.raw; // 保存文件内容
    },

3. submitForm()

提交   我们要动态处理avatarFile  新增有,修改不一定有

  /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        console.log("formDta")
        console.log(this.formData)
        console.log(this.formData.memberId)
        // 创建 FormData 对象
        const formData = new FormData();
        // 动态处理 avatarFile
        if (this.formData.avatarFile instanceof File) {
          formData.append('avatarFile', this.formData.avatarFile);
        }
        // 将表单中的其他数据添加到 FormData
        formData.append('memberId',this.formData.memberId)
        formData.append('name', this.formData.name);
        formData.append('major', this.formData.major);
        formData.append('joinTime', this.formData.joinTime);
        formData.append('expertise', this.formData.expertise);
        formData.append('employmentCompany', this.formData.employmentCompany);
        formData.append('phone', this.formData.phone);
        formData.append('pictureUrl',this.formData.pictureUrl)

        if (valid) {
          if (this.formData.memberId != null) {
            updateInfo(this.formData).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addInfo(this.formData).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },

 请求

加一个headers,确保前端传入后端数据是'multipart/form-data' 编码方式


// 修改研发团队成员展示
export function updateInfo(data) {
  return request({
    url: '/RDTeam/info',
    method: 'put',
    data: data,
    headers: {
      'Content-Type': 'multipart/form-data'  // 手动设置 Content-Type
    }
  })
}

新增应该一样,复制粘贴后端修改代码应该就行了

 然后然后就结束了(撒花)

本博客是一次记录,不确定有没有错,可能有没发现的错误(祈祷没有),但是目前可以实现。

基于阿里云OSS对象存储 阿里云OSS对象存储 阅读详情

相关推荐

阿里云 OSS 对象存储 OSS 图片加文字水印

阿里云 OSS 对象存储实际开发需先阅读 阿里云 [OSS快速入门文档](https://help.aliyun.com/document_detail/31883.html?spm=5176.208357.1107607.14.7f06390fo9yUNT)开通服务无实际操作难度,PASS创建存储空间获取 Access Key若开通编程访问,请及时保存AccessKey 信息,页面关闭后将无法再...

ts3211的博客 1万+

Ruoyi框架上传文件、图片到阿里云Oss教程

大体思路:1、首先你得有个OSS2、使用阿里云Oss Java SDK,调整ruoyi框架代码1、前提引入:Ruoyi默认上传文件的地址为本地服务器,而我想把文件传到云存储上,起初想着直接用ECS服务器,结果找了半天发现并不好使,于是听劝,正好有试用,弄了个OSS……

qq_64595427的博客 1万+

C# 操作阿里云对象存储OSS对图片进行上传、删除操作

一、获取对象存储OSS的AccessKey 在控制台对象存储网页中找到右上角的用户信息,点击“AccessKey管理”(下图) 进入到安全信息管理(也就是保存AccessKey的)界面(下图),如果没有AccessKey,需要自己创建。 存储空间可以手动创建,也可以通过代码创建,在该文章中,使用了手动创建,所以没有存储空间创建部分代码。 C#代码操作OSS 一、添加Aliyun.OSS.SDK 在Visual Studio中的Nuget程序包管理器中下载该程序包。(如下图) 二、代码实现 OssUti

weixin_38601677的博客 4650

若依前后端分离集成阿里云OSS分布式文件存储

若依前后端分离集成阿里云OSS分布式文件存储

qq_57943924的博客 5009

腾讯cos大文件上传java代码示例及遇到的问题总结

观察规律发现是第一次上传成功,后续就失败。仔细查看发现是cos文档中有一段代码写的是true,改成false就可以了。COSClient不能关闭。

若水印象博客 1670

Vue3 - 超详细 “纯前端“ 将阿里云 OSS 存储文件删除教程,支持单个 / 批量删除各种图片图像、文档、音视频文件、压缩包等文件(附完整示例运行源码,保证新手小白 100% 轻松实现删除功能)

vue3,oss删除,阿里云OSS删除,vue3阿里云oss批量删除,vue3oss删除文件,vue3前端删除阿里云oss上的文件,vue3如何纯前端不依靠后端直接删除阿里云oss文件,vue3不调用接口删除oss文件,vue3删除oss纯前端完成,vue3阿里云oss删除文件,阿里云OSS删除文件详细步骤,vue3+oss上传/预览/下载/删除,vue3+Element实现前端调用阿里云oss上传,删除,OSS中删除文件的代码示例,vue3阿里云oss文件的基本删除操作,vue前端删除阿里云oss文件

🏆 前端领域优质创作者 3492

SpringBoot整合阿里云OSS实现单个图片上传和批量上传

SpringBoot整合阿里云OSS实现单个图片上传和批量上传

H_Q_Li的博客 5290

java开发oa系统源码下载-ruoyi-cms:基于若依的内容管理系统,集成redis,邮件,websocket,可视化oss等

java开发oa系统源码下载 <<<<<<< HEAD 若依内容管理系统简介 模板管理:用户可以自定义模板,填充对应的数据以便应付不同需求。 主题管理:支持主题上传,切换以及模板,切换不用重启服务器。 缓存管理:支持Redis缓存,提高系统相应速度。同时支持查看缓存,重置缓存。 栏目管理:前端菜单管理,支持多级树,可以应付复杂的导航,已支持额外SEO字段。 分类管理:支持多级树,完全可以应付复杂分类,已支持额外SEO字段。 标签管理:标签用于标记文章特色,已支持额外SEO字段。 文章管理:支持不同类型,多关键字的文章发布。 储存管理:按时间归类,目前至此本地和七牛,后续会有扩展。 邮件管理:邮件在线配置,发送,支持多种类型邮件发送。 websocket模块:内含websocket模块,基本案例单聊,群聊。 配置管理:完整的网站配置,方便SEO,个性化设置。 标签开发:简化主题制作,直接调用Service。 支持用户:丰富内容系统,方便二次开发。 内置淘宝:支持批量上传优惠卷 文章检索系统:使用solr检索文章 链接管理:支持分组,方便做导航类网站 文章相关操作:包含评论,浏览记录,评分

记录一次使用Aliyun OSS 存图片

记录一次使用阿里云OSS存图片

ying_521125的博客 10万+

西门子AI面试问答(STAR法则回答实例)

通过建立良好的沟通渠道、倡导透明和积极的沟通,并建立信任和共享目标的文化,我成功地改善了团队合作的氛围和效果。对于一些存在分歧和冲突的情况,我采用了积极的解决问题的态度,促进双方的沟通和理解,寻找共同的利益点和解决方案。我的成果得到了评委和观众的认可,并为我的学术发展和进一步的科学研究奠定了基础。首先,我主动与团队成员进行一对一的沟通,倾听他们的观点和意见,了解他们在合作中遇到的问题和需求。我还参加了学校组织的科学俱乐部和研究小组,与其他热衷科学的同学一起进行讨论和实验,加深我的理解和实践技能。

kashine的博客 7249

OpenFOAM高效学习路线:如何用B站+东岳流体3个月掌握CFD仿真

本文分享了一套高效的OpenFOAM学习路线,结合B站视频、东岳流体教程和官方文档,帮助在职工程师在3个月内掌握CFD仿真技术。通过渐进式学习计划和案例训练,从基础到实战,快速提升独立建模能力。

weixin_29202213的博客 319

elementui图片上传后删除图片

修改时删除OSS服务器老图片: @Override public void updateDrug(Drug drug) { //判断新图片和老图片都不为null if(StringUtils.isNotBlank(drug.getImg()) && StringUtils.isNotBlank(drug.getPhoto())){ //删除老图片 OSSUtil.deleteFile(drug.getIm

jq1223的博客 1378

CentOS 7 安装 Python 3.10

我这里已经软链接了,正常未链接之前是python->python2.7而不是python3.10。python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用。2. 安装 Python 3.10 必需的 openssl >= 1.1.1。默认的centos7是没有安装pip,先添加epel扩展源。/usr/bin/python 修改为如下。添加软链接,将原来的链接备份。添加python3的软链接。

bensonyang888的博客 2905

实现图片上传至阿里云OSS存储

从购买对象存储OSS资源包和下行流量包到实现上传功能代码的编写的过程;添加水印;You have no right to access this object because of bucket acl.的错误原因。

Orcas 2万+

保姆级教程:在SIwave 2024 R2中搞定TDR仿真,手把手教你分析USB 3.0差分线阻抗

本文提供了一份详细的SIwave 2024 R2 TDR仿真教程,重点讲解如何分析USB 3.0差分线阻抗。从项目准备、参数配置到结果分析,逐步指导工程师完成完整的仿真流程,并分享实战经验和高级技巧,帮助提升信号完整性分析能力。

weixin_33670786的博客 497

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2164

在SpringBoot中使用【阿里云OSS对象存储】存取图片

一、前言 之所以引入 OSS云储存技术,是因为在【开发环境】中,我们是使用 windows 操作系统的,而在【生产环境】服务器是使用 Linux 操作系统的,如此一来图片保存到数据的路径就不一致了,有点不方便,虽然可以使用 Spring 的 @Condition来定义 Linux、windows 环境才运行的代码,但是多此一举,实在可惜。 OSS云存储技术,不一定要使用 阿里云的,如腾讯...

IT小村 1万+

【人工智能】 WebDev Arena:实时AI Web开发竞赛的技术探索与价值

《AI编程竞赛推动Web开发技术创新》摘要:WebDev Arena作为聚焦Web开发领域的实时AI编程竞赛,通过标准化竞技环境检验AI模型在代码生成、问题解决等方面的能力。竞赛覆盖前端、后端等全流程开发环节,采用实时评分机制,推动AI对复杂Web需求的理解和多元技术栈适配。该赛事不仅促进AI编程技术创新,更为Web开发行业与AI技术融合搭建桥梁,有望提升开发效率、降低技术门槛。未来将拓展Web3.0等前沿技术主题,持续推动行业智能化发展。(150字)

奶爸的编程之路,也就一周冷个三天 255

图片存储解决方案--阿里云OSS

图片存储解决方案 实现图片上传服务,需要有存储的支持,那么我们的解决方案将以下几种: 直接将图片保存到服务的硬盘 优点:开发便捷,成本低 缺点:扩容困难 使用分布式文件系统进行存储 优点:容易实现扩容 缺点:开发复杂度稍大(有成熟的产品可以使用,比如:FastDFS) 使用nfs做存储 优点:开发较为便捷 缺点:需要有一定的运维知识进行部署和维护 使用第三方的存储服务 优点:开发简单,拥有强大功能,免维护 缺点:付费 阿里云OSS存储 1

那就这样吧~ 1万+

SAP-ABAP:SAP HANA性能神器FDA:是极速查询的引擎,也是CPU过载的元凶

在SAP S/4HANA的世界里,有一个被ABAP开发者们既爱又怕的特性——Fast Data Access(FDA),它能将性能提升百倍,也能让CPU瞬间飙升。本文将带您全面解剖这一核心机制。

baidu_35680696的博客 849

第7章: MMU notifier在AMD GPU驱动中的应用

AMD GPU驱动利用MMU Interval Notifier机制实现共享虚拟内存(SVM)和异构内存管理(HMM)。通过分析AMDGPU内存架构(VRAM、GTT、Userptr)和Buffer Object设计,重点探讨了Userptr零拷贝机制如何依赖MMU notifier保持CPU/GPU内存一致性。HMM框架进一步实现统一地址空间和透明页面迁移,AMDGPU通过amdgpu_hmm.c实现两种invalidate回调(GFX和HSA模式),处理不同场景下的内存失效同步问题。

图形/计算GPU的驱动与虚拟化技术分享园地 2470

SpringBoot集成阿里云OSS实现图片存储服务

对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。地址:https://www.aliyun.com/product/oss。

请你喝杯Java 2250

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

全解OSS存储图片问题

什么是OSS(对象存储服务)​对象存储服务)是一种用于存储和管理大规模数据的云存储服务。它通过提供高可靠性、高可扩展性和低成本的存储解决方案,帮助用户实现数据的持久存储和随时访问。OSS可以存储各种类型的数据,包括图片、视频、文档等,并且具备高速上传和下载的能力,使得用户可以轻松地在应用程序中集成和使用。同时,OSS还提供了多种功能和工具,如数据备份、数据迁移、权限管理等,帮助用户更好地管理和保护数据。

1558

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

对象存储之阿里云OSS最详细的实现

想要快速上手阿里云的OSS对象存储,那么安排,本篇教程就是手把手带你速度掌握阿里云的OSS,实现项目中的资源存储的问题,来,学起来!

程序员Feri 2721

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

使用阿里云OSS实现图片上传案例

使用阿里云OSS存储实现图片上传案例

Java学习博客 8653

图片存储阿里云oss

阿里云oss存储 在开发中我们很经常遇见需要上传图片的功能,图片上传功能开发简单,但问题是我们一般把图片存在到哪里呢? 有下面几种解决方案 1.直接将图片保存到服务的硬盘 优点:开发简捷,成本低 缺点:扩容难 2.使用分布式文件系统进行存储(比如fastDfs) 优点:容易实现扩容 缺点:开发复杂度稍大(尤其是开发复杂的功能) 3.使用nfs做存储(没操作过) 优点:开发较为便捷 缺点:需要有一定的运维知识进行部署和维护 4.使用第三方的存储服务 优点:开发简单,拥有强大功能,免维护 缺点

qq_39095899的博客 2187
上一篇: 关注与否——若依判断是否唯一
FSRAAA
博客等级 码龄4年 48粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值