SpringBoot+OSS文件(图片))上传

SpringBoot整合OSS实现文件上传

以前,文件上传到本地(服务器,磁盘),文件多,大,会影响服务器性能

如何解决? 使用文件服务器单独存储这些文件,例如商业版–>七牛云存储,阿里云OSS,腾讯云cos等等

也可以自己搭建文件服务器(FastDFS,minio)

0 过程中需要实名认证

1 开通阿里云OSS

image-20240719152009607

2 创建bucket

image-20240719152243439

其他不用管,直接完成即可

3 获取AccessKeyId、AccessKeySecret

image-20240719152336136

image-20240719152737253

墙裂建议,保存好此文件,因为后续无法再查看,只能删除重建

4 获取外网访问域名

image-20240719153351723

Endpoint(地域节点): xxxxx

Bucket 域名 : xxxxx

5 创建文件夹

image-20240719153550710

oss中存储在app/upload下

6 添加依赖

  		<!-- 阿里云OSS-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

7 封装常量类

根据自己实际情况改变

public class AliyunOSSConstants {

    // OSS唯一key
    public static final String ASSCESS_KEY_ID = "你的ASSCESS_KEY_ID";
    // OSS唯一key秘钥
    public static final String ASSCESS_KEY_SECRET = "你的ASSCESS_KEY_SECRET";
    // 地域节点
    public static final String END_POINT = "你的地域节点";
    // Bucket名称
    public static final String BUCKET_NAME = "你的Bucket名称";
    // 文件一级路径
    public static final String FILE_DIR = "oss中创建的文件路径";
    // 文件访问域名
    public static final String COMMON_URL = "这个是后续访问的公共路径前缀";

}

8 封装工具类

package com.qf.util;

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.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @date 2024/12/08
 * @desc
 */
public class AliyunOSSUtil {

    /**
     * 上传文件
     */
    public static String upLoad(MultipartFile file) {
        System.out.println("------OSS文件上传开始--------" );

        String endPoint = AliyunOSSConstants.END_POINT;
        String accessKeyId = AliyunOSSConstants.ASSCESS_KEY_ID;
        String accessKeySecret = AliyunOSSConstants.ASSCESS_KEY_SECRET;
        String bucketName = AliyunOSSConstants.BUCKET_NAME;
        String fileDir = AliyunOSSConstants.FILE_DIR;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = format.format(new Date( ));
        String fileUrl = null;
        OSS client = new OSSClientBuilder( ).build(endPoint, accessKeyId, accessKeySecret);
        try {
            // 判断容器是否存在,不存在就创建
            if (!client.doesBucketExist(bucketName)) {
                client.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                client.createBucket(createBucketRequest);
            }
            String originalFilename = file.getOriginalFilename( );
            String suffix = originalFilename.substring(originalFilename.indexOf("."));
            // 设置文件路径和名称
            fileUrl = fileDir + "/" + (dateStr + "/" + UUID.randomUUID( ).toString( ).replace("-", "") + suffix);
            System.out.println("fileUrl:" + fileUrl);
            // 上传文件
            PutObjectResult result = client.putObject(new PutObjectRequest(bucketName, fileUrl, file.getInputStream( )));
            // 设置权限(公开读)
            client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            if (result != null) {
                System.out.println("resp:" + result);
                System.out.println("------OSS文件上传成功------" + AliyunOSSConstants.COMMON_URL + fileUrl);
            }
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace( );
        } finally {
            if (client != null) {
                client.shutdown( );
            }
        }
        return AliyunOSSConstants.COMMON_URL + fileUrl;
    }

    /**
     * 删除文件
     */
    public static String delete(String fileUrl) {
        System.out.println("------OSS文件删除开始--------" + fileUrl);

        String endPoint = AliyunOSSConstants.END_POINT;
        String accessKeyId = AliyunOSSConstants.ASSCESS_KEY_ID;
        String accessKeySecret = AliyunOSSConstants.ASSCESS_KEY_SECRET;
        String bucketName = AliyunOSSConstants.BUCKET_NAME;
        OSS client = new OSSClientBuilder( ).build(endPoint, accessKeyId, accessKeySecret);
        try {
            client.deleteObject(bucketName, fileUrl);
            System.out.println("------OSS文件删除成功------" + AliyunOSSConstants.COMMON_URL + fileUrl);
        } catch (OSSException oe) {
           oe.printStackTrace();
        } catch (ClientException ce) {
           ce.printStackTrace();
        } finally {
            if (client != null) {
                client.shutdown( );
            }
        }
        return AliyunOSSConstants.COMMON_URL + fileUrl;
    }
}

9 接口测试

@RestController
public class UploadController {

    /**
     * 演示上传文件到OSS
     */
    @PostMapping("/upload")
    public R upload(MultipartFile file){
        String filePath = AliyunOSSUtil.upLoad(file);
        return R.ok(filePath);
    }

}

10 前端

<template>
  <div>
    <h2>文件上传</h2>
    <!--
    :http-request="uploadFile"  是用来覆盖默认的action的请求路径的
    action=""不能删除,因为是<el-upload>组件必填参数,不填会报错
    -->  
    <el-upload
      class="upload-demo"
      drag
      action=""
      :http-request="uploadFile"  
      :on-change="handleChange"
      multiple>
      <i class="el-icon-upload"></i>
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
    </el-upload>
    <div>
      <!-- 上传后展现图片的地方 -->  
      <img :src="fileSrc" width="200px">
    </div>
  </div>

</template>

<script>
import {uploadPicture} from '@/api/upload'
export default {
  data(){
    return{
      file:null,
      fileSrc:null
    }
  },
  methods:{
    handleChange(file){
      this.file = file.raw;
    },
    uploadFile(){
      const file = this.file;
      // FormData是js对象,用于存储表单数据  
      const formData = new FormData();
      formData.append("file", file); // 由后端接口决定,后端参数叫file
      uploadPicture(formData).then((res) => {
        this.$message({
          message: "上传成功",
          type: "success",
        });
        this.fileSrc = res.data
        console.log("fileSrc",this.fileSrc)
      });
    }
  }
}
</script>

<style scoped lang="scss">

</style>

使用:http-request指定文件上传的函数,原有的action、:before-upload、:on-success等不起作用。但删去action可能有报错,所以还是写了action=“”。

uploadPicture()是封装的函数,在upload.js中

import request from '@/utils/request'

export function uploadPicture(data) {
  return request({
    url: '/upload',
    method: 'post',
    data
  })
}

11 测试即可

image-20240719162138204

12. 后续,需要改造后端

现在只是上传成功

还需要将上传好的图片地址存储到数据库,后续查询时查出地址,在前端展现

提示: 数据库存储图片地址时不要太长,可以只存储重要信息. 公共部分可以等从数据库查询出后再拼接展现给前端

image-20241204104005570

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux其三,yum源配置,定时任务,免密登录和查找命令

目录 一、Linux的两种软件安装方式 1、Yum源配置 2、linux中软件安装的另一种方式 rpm 3、安装mysql8.0 二、对虚拟机进行克隆 1、先关机 2、最新的状态&#xff0c;整个快照 3、开始克隆 4、修改克隆的服务器的硬件设置 5、修改克隆机的IP地址&#xff08;因为跟第一…

linux环境GitLab服务部署安装及使用

一、GitLab介绍 GitLab是利用Ruby onRails一个开源的版本管理系统&#xff0c;实现一个自托管的Git项目仓库&#xff0c;可通过Web界面进行访问公开的或者私人项目。 二、GitLab安装 1、先安装相关依赖 yum -y install policycoreutils openssh-server openssh-clients postf…

/usr/local/go/bin/go: cannot execute binary file: Exec format error

现象&#xff1a;ubuntu中安装go软件环境&#xff0c;报上述错误 原因&#xff1a;系统与软件不适配 解决&#xff1a;查看本系统的版本 找到x86-64对应的go版本即可

技术 + 舞蹈,探秘 SpringBoot 硬核广场舞团

3 系统分析 3.1 系统可行性分析 3.1.1 经济可行性 由于本系统是作为毕业设计系统&#xff0c;且系统本身存在一些技术层面的缺陷&#xff0c;并不能直接用于商业用途&#xff0c;只想要通过该系统的开发提高自身学术水平&#xff0c;不需要特定服务器等额外花费。所有创造及工作…

MySQL Workbench基本使用

MySQL Workbench 是一款由 MySQL官方开发和提供的统一可视化工具&#xff0c;专为数据库管理员、开发者和数据架构师设计。它提供了数据建模、SQL 开发和数据库管理的全面功能&#xff0c;支持 Windows、Linux 和 macOS 操作系统。 MySQL Workbench 是一个强大的工具&#xff…

fedora下Jetbrains系列IDE窗口中文乱码解决方法

可以看到窗口右部分的中文内容为小方块。 进入 Settings - Appearance & Behavior - Appearance - Use custom font : Note Sans Mono CJK SC &#xff0c;设置后如下图&#xff1a;

厦门凯酷全科技有限公司抖音电商服务的卓越典范

在短视频和直播带货迅速崛起的时代&#xff0c;厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全科技”&#xff09;以其专业的服务、创新的精神以及对市场的深刻理解&#xff0c;在抖音电商领域中脱颖而出&#xff0c;成为众多品牌商家信赖的选择。本文将深入探讨凯酷全科…

Android显示系统(05)- OpenGL ES - Shader绘制三角形(使用glsl文件)

Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角形 Android显示系统&#xff08;05&#xff09;- OpenGL…

Ubuntu中配置交叉编译工具的三条命令的详细研究

关于该把下面的三条交叉编译配置语句加到哪里&#xff0c;详情见 https://blog.csdn.net/wenhao_ir/article/details/144326545 的第2点。 现在试解释下面三条交叉编译配置语句&#xff1a; export ARCHarm export CROSS_COMPILEarm-buildroot-linux-gnueabihf- export PATH$…

【环境搭建】WordPress本地部署搭建及历史版本插件安装(windows系统)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【环境搭建】WordPress本地部署搭建及历史版本插件安装&#xff08;windows系统&#xff09; WordPress搭建环境部署&#xff08;…

【开源免费】基于SpringBoot+Vue.JS大创管理系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 081 &#xff0c;文末自助获取源码 \color{red}{T081&#xff0c;文末自助获取源码} T081&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

47 基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

outlook软件配置邮箱提示“到邮件服务器的加密连接不可用”

outlook软件配置邮箱提示“到邮件服务器的加密连接不可用” 问题描述&#xff1a; outlook软件里邮箱提示“已断开”或配置邮箱时提示“到邮件服务器的加密连接不可用”。 解决方案&#xff1a; 一、更改注册表&#xff08;可先导出备份&#xff09; winr&#xff0c;输入re…

Jmeter进阶篇(30)深入探索 JMeter 监听器

前言 在性能测试领域里,Apache JMeter 是一款经典而强大的工具,而其中的监听器(Listeners)组件更是发挥着不可或缺的关键作用。 监听器就像敏锐的观察者,默默记录测试执行过程中的各种数据,作为系统性能分析的数据依据。 本文将带你全方位走进 JMeter 监听器的奇妙世界,…

微调 Llama 3.2:让 AI 更好地读取医学图像

您是否想知道人工智能模型如何学习理解医学图像&#xff1f;今天&#xff0c;我将带您完成一个令人兴奋的项目&#xff1a;微调 Meta 的 Llama 3.2 Vision 模型来分析放射线图像。如果您不是技术专家&#xff0c;也不要担心 - 我会用简单的术语来解释。 它是如何运作的&#x…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)

相信实验一大家已经完成了&#xff0c;对Arcgis已进一步熟悉了&#xff0c;现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…

【Spring项目】表白墙,留言板项目的实现

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;项目实现准备 1&#xff1a;需求 2&#xff1a;准备工作 &#xff08;1&#xff09;…

如何在 Ubuntu 上安装开源监控工具 Uptime Kuma

简介 Uptime Kuma&#xff08;或简称 Kuma&#xff09;是一个开源监控工具&#xff0c;用于监控 HTTP、HTTPS、DNS 等协议的服务。Uptime Kuma 提供多种功能&#xff0c;如多语言支持、多个状态页面、代理支持等。 接下来&#xff0c;我将一步一步教大家如何进行安装和部署&am…

Idea实现定时任务

定时任务 什么是定时任务&#xff1f; 可以自动在项目中根据设定的时长定期执行对应的操作 实现方式 Spring 3.0 版本之后自带定时任务&#xff0c;提供了EnableScheduling注解和Scheduled注解来实现定时任务功能。 使用SpringBoot创建定时任务非常简单&#xff0c;目前主要…

Spark实训

实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…