springboot实现文件上传功能,整合云服务


文章目录

  • 这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发
  • 文件上传功能剖析
  • 进行书写一个小的文件上传
  • 文件上传的文件三要素
    • 首先表单提交的方式要是 post方式,
    • 第二个enctype="multipart/form-data 这个要求
    • 第三个是在提交文件的type要选择 type="file"的方式
  • 云存储 ,进行云存储保存改造
    • 项目整合云服务存储
  • AliOssUtils的书写
    • 首先进行数据的存储地址分析


这是springboot案例的,文件上传功能的拆分,本篇将带大家彻底了解文件上传功能,先从本地存储再到云存储,全网最详细版本,保证可以学会,可以了解文件上传功能的开发

文件上传功能剖析

首先分析业务场景,文件上传功能场景,一般是修改员工信息,或者新增用户要上传的文件信息,

在这里插入图片描述
这里文件上传

这是场景分析

进行书写一个小的文件上传

先写一个html文件

在springboot项目中,在resource中,书写一个html页面

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<!--enctype="multipart/form-data"-->
<form method="post" enctype="multipart/form-data" action="/upload">
    姓名:<input type="text" name="username">
    <br>
    年龄:<input type="text" name="age">
    <br>
    文件:<input type="file" name="image">
    <br>
    <input type="submit" value="提 交">

</form>


</body>
</html>

这是一个表单页面代码,下面要介绍一下文件上传的前端三要素

文件上传的文件三要素

首先表单提交的方式要是 post方式,

第二个enctype="multipart/form-data 这个要求

第三个是在提交文件的type要选择 type="file"的方式

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<!--enctype="multipart/form-data"-->
<form method="post" enctype="multipart/form-data" action="/upload">
    姓名:<input type="text" name="username">
    <br>
    年龄:<input type="text" name="age">
    <br>
    文件:<input type="file" name="image">
    <br>
    <input type="submit" value="提 交">

</form>


</body>
</html>

这个是前端文件的全部代码,可以直接使用

在这里插入图片描述前端

那么书写完前端后,就可以书写后端

package com.healer.controller;

import com.healer.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * @author healer
 * @Description UploadController
 * @data 2024-06-01 9:35
 */

@RestController
@Slf4j
public class UploadController {

    @PostMapping("/upload")
    public Result uploadFile(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传.....{} {}", username, age);

//        首先获取源文件
        String originalFilename = image.getOriginalFilename();

//        使用UUID生成新文件名
        String uuid = UUID.randomUUID().toString();

//        截取
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));

        String newFile = uuid + substring;

        image.transferTo(new File("D:\\images\\" + newFile));

        return Result.success();
    }
}

这个是后端的代码

在上传文件的时候会需要进行,文件名防止重复
所以这里使用UUID去生成前面的文件名
然后再获取文件名的拓展名
然后使用uuid生成的id 与拓展名进行拼接
那么就获取新的文件名
上传文件

在这里插入图片描述
在这里插入图片描述
然后就文件上传成功了

本地存储完成

没有什么业务逻辑

直接在controller层接收数据 然后保存就可以了

云存储 ,进行云存储保存改造

项目都会搭建文件存储服务,或者是使用云服务去存储文件

先进行下载依赖

然后找代码程序

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "D:\\localpath\\examplefile.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);
        } 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();
            }
        }
    }
} 

只需要再上面修改你的oss信息就可以使用
进行测试
测试通过就可以使用

项目整合云服务存储

项目整合阿里云oss,第一步需要进行改造为工具类

首先分析,在上传文件,上传成功之后需要返回图片的url地址

所以返回值是string类型

然后要分析图片的地址
进行封装

https://tailsdemo01.oss-cn-beijing.aliyuncs.com/1.png

首先第一部分是 https://
然后是 bucketName
然后是.oss-cn-beijing.aliyuncs.com
然后是 /
然后是文件的名字
使用工具类进行封装

那么上传文件肯定是上传一个 multitypeFile类型

MultipartFile image

    @PostMapping("/upload")
    public Result uploadFile(MultipartFile image) throws Exception {
        String upload = aliOssUtil.upload(image);
        return Result.success(upload);

    }

在这里插入图片描述
返回的data就可以存储在数据库中,那么用户可以直接通过iamge的标签进行查询到数据内容

AliOssUtils的书写

首先这个工具类是基于实例代码进行改写

package com.healer.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;

/**
 * @author healer
 * @Description AliOssUtil
 * @data 2024-06-01 15:23
 */

@Component
public class AliOssUtil {

    String endpoint = "";
    String accessKeyId = "";
    String accessKeySecret = "";
    String bucketName = "";

    public String upload(MultipartFile multipartFile) throws Exception {


        String originalFilename = multipartFile.getOriginalFilename();
        String objectName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));


        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);


        try {
            InputStream inputStream = multipartFile.getInputStream();
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 创建PutObject请求。
            PutObjectResult result = ossClient.putObject(putObjectRequest);

        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }


//            String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        //        https://tailsdemo01.oss-cn-beijing.aliyuncs.com/1.png
        return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;
    }

}

那么就几个点

首先第一个点
这个方法需要返回值

首先进行数据的存储地址分析

在这里插入图片描述
https://tailsdemo01.oss-cn-beijing.aliyuncs.com/1.png

首先第一部分是 https://
然后是 bucketName
然后是.oss-cn-beijing.aliyuncs.com
然后是 /
然后是文件的名字
使用工具类进行封装

//这个是获得文件原始名字
String originalFilename = multipartFile.getOriginalFilename();
然后进行改造

 String objectName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

新名字
使用UUID进行生成前缀,可以确保没有重复
然后再使用文件的后缀

之后就获得新名字,然后上传阿里云

文件的内容是将这个文件先转为inputStream
multipartFile.getInputStream();
文件的传输都是multipartFile 类型
所以可以一步拿到 inputStream流
然后就直接塞到方法里面

工具类更改完毕,可以直接用了

可以将这个工具类交给springIOC容器
让spring去管理
我们直接拿到工具类的代理对象就可以
那么在controller中

    @PostMapping("/upload")
    public Result uploadFile(MultipartFile image) throws Exception {
        String upload = aliOssUtil.upload(image);
        return Result.success(upload);

    }

至此,功能完毕,完结

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

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

相关文章

艾体宝洞察 | Redis Enterprise对比ElastiCache

选择缓存数据库时&#xff0c;如何在Amazon ElastiCache和Redis Enterprise之间做出选择&#xff0c;应当考虑哪些标准&#xff1f; ElastiCache 通常可以满足基本的缓存需求&#xff0c;因此是一种适合初始阶段的解决方案。但随着使用量的增加&#xff0c;ElastiCache很快会变…

FreeSWITCH 1.10.10 简单图形化界面21-录音相关

FreeSWITCH 1.10.10 简单图形化界面21-录音相关 FreeSWITCH GUI界面预览00、安装FreeSWITCH GUI先看使用手册1、录音相关的应用11、record用法&#xff1a;举例&#xff1a;注意&#xff1a; 12、record_session用法&#xff1a;举例&#xff1a; 2、录音相关的变量3、单腿录音…

ICPC训练赛补题集

ICPC训练赛补题集 文章目录 ICPC训练赛补题集D - Fast and Fat (负重越野)I-路径规划G. Inscryption(邪恶铭刻)NEW Houses雪中楼(西安交通大学)L.BracketGenerationE - Checksum D - Fast and Fat (负重越野) 原题链接&#xff1a;原题链接 题意&#xff1a;体重大的背体重小的…

图像处理ASIC设计方法 笔记26 非均匀性校正SOC如何设计

在红外成像技术领域,非均匀性校正是一个至关重要的环节,它直接影响到成像系统的性能和目标检测识别的准确性。非均匀性是指红外焦平面阵列(IRFPA)中各个像元对同一辐射强度的响应不一致的现象,这种不一致性可能是由于制造过程中的缺陷、材料的不均匀性或者像元间的热电特性…

Mysql 8.0.37 安装教程

图片有点长&#xff0c;慢慢来 安装教程 安装地址&#xff1a;MySQL :: MySQL Downloads 进入官网 下载社区版 此处有两个版本&#xff0c;我们下载的是8.0.37版本 第一个需要联网安装&#xff0c;我们现在第二个离线安装 server only&#xff1a;仅安装MySQL server clien…

SpringCloud如何实现SSO单点登录?

目录 一、SpringCloud框架介绍 二、什么是SSO单点登录 三、单点登录的必要性 四、SpringCloud如何实现SSO单点登录 一、SpringCloud框架介绍 Spring Cloud是一个基于Spring Boot的微服务架构开发工具集&#xff0c;它整合了多种微服务解决方案&#xff0c;如服务发现、配置…

Django里多app

在 Django 里的某一个项目&#xff0c;里面得包含很多 App (功能)&#xff0c;那么如何在该项目里管理这么多App呢&#xff1f; 先说明下背景&#xff1a;未先创建 apps 文件夹来存各个app文件夹&#xff0c;直接在项目文件目录里创建各个app。为了便于管理&#xff0c;得将各…

【TB作品】msp430f5529单片机墨水屏,口袋板,显示温度和万年历,tmp421温度,RTC时间

文章目录 一、部分程序二、展示三、全部代码下载 一、部分程序 int main(void) {WDTCTL WDTPW | WDTHOLD; //关闭看门狗init(); //屏幕初始化InitIIC(); //I2C初始化TMP_Init(); //tmp421初始化SetupRTC();_EINT();while (1){} }#pragma vectorRT…

在鸿蒙中身份校验的手势密码的实现

在harmony中它提供了默认的组件PatternLock()&#xff1b; 这个就能直接显示九宫格密码验证 并且他有两个主要的回调事件 .onDotConnect密码输入选中宫格圆点时触发该回调 .onPatternComplete&#xff1a;密码输入结束时触发该回调 //如代码实现 PatternLock().sideLength(32…

【scikit-learn009】异常检测系列:单类支持向量机(OC-SVM)实战总结(看这篇就够了,已更新)

1.一直以来想写下机器学习训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架OCSVM模型相关知识体系。 3.欢迎批评指正,欢迎互三,跪谢一键三连! 4.欢迎…

linux上VirtualBox使用

前言 最近想把唯一的windows系统装成linux&#xff0c; 但是确实存在一些特殊软件无法舍弃&#xff0c;所有装完linux需要用虚拟机装个windows 上来使用特定的一些软件&#xff08;不想用wine了&#xff09;。 还有对一些特定usb设备的透传&#xff0c;这样才能保证在虚拟机中…

计算机组成原理·存储系统疑点归纳

组原这门课有点学得不是很懂&#xff0c;现在快考试了&#xff0c;挑几个做错了的题分析、记录一下。 N o . 1 \mathit{No}.1 No.1  x x x、 y y y 为定点整数&#xff0c;其格式为 1 1 1 位符号位、 n n n 位数值位&#xff0c;若采用补码一位乘法实现乘法运算&#xff0c;则…

idea中导入代码文件无法修改,显示File is read-only,怎么办?难办?那就别办了------看下面

File is read-only 文件属性只读&#xff0c;不可修改。。。。。 第一次遇到这种问题&#xff0c;去网上搜了一堆方法&#xff0c;都试了&#xff0c;没用&#xff0c;最后居然还建议我重装idea&#xff0c;我还差点信了&#xff0c;经9X9难后&#xff0c;取得真经。 问题解决…

python实现描述统计

数据基础情况 import numpy as np import pandas as pd import matplotlib.pyplot as pyplot pd.options.display.max_rows 10##最多输出10行数据 data_url https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ST0151EN-SkillsN…

primeflex Display盒模型显示相关样式实战案例

01 Display盒子模式相关样式 基础样式 ClassPropertieshiddendisplay: none;blockdisplay: block;inlinedisplay: inline;inline-blockdisplay: inline-block;flexdisplay: flex;inline-flexdisplay: inline-flex; 样式说明&#xff1a; hidden&#xff1a;隐藏&#xff0c…

Arrays(操作数组工具类)、Lambda表达式

package exercise;import java.util.Arrays;public class ArraysDemo {public static void main(String[] args) {int[] arr {1, 2, 3, 4, 5};//将数组变成字符串System.out.println(Arrays.toString(arr));//二分查找法查找元素//细节1&#xff1a;1.数组必须是有序的 2.元素…

c# 学习教程

打印语句 折叠代码 变量 整形 浮点型 特殊类型

Java18+前端html+后端springboot一套可在线预约、在线下单的家政预约上门服务系统源码 家政系统(用户端)介绍

Java18前端html后端springboot一套可在线预约、在线下单的家政预约上门服务系统源码 家政系统&#xff08;用户端&#xff09;介绍 家政服务用户端是一个为家庭用户提供便捷、高效家政服务的应用程序。 以下是家政服务用户端的详细功能描述&#xff1a; 一、注册与登录&#…

离线环境下安装NVIDIA驱动、CUDA(HUAWEI Kunpeng 920 + NVIDIA A100 + Ubuntu 20.04 LTS)

文章目录 前言 一、基础环境 1.1、处理器型号 1.2、英伟达显卡型号 1.3、操作系统 1.4、软件环境 二、取消内核自动升级 2.1、查看正在使用的内核版本 2.2、查看正在使用的内核包 2.3、禁止内核更新 三、配置本地apt源 3.1、挂载iso镜像文件 3.2、配置apt源 3.3、…

形式参数和实际参数

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在调用函数时&#xff0c;大多数情况下&#xff0c;主调函数和被调用函数之间有数据传递关系&#xff0c;这就是有参数的函数形式。函数参数的作用是…