SpringBoot后端接收Axios上传的文件

很多时候,我们项目开发的过程中,难免会遇到文件上传的需求

对于SpringBoot项目,我们该如何编写一个文件上传的接口呢?

这里我用的是阿里云OSS云服务器来作为上传文件的存储仓库,比起存储在电脑本地,云服务器更加便于管理、性能更好并且更加安全,值得我们选择。

好消息是我们可以免费试用!这里我们可以作为学习来使用

下面给出阿里OSS平台官网:

https://oss.console.aliyun.comicon-default.png?t=N7T8https://oss.console.aliyun.com

1、后端的文件接收逻辑

SpringBoot提供了MultipartFile这么一个类对象,我们可以借助于这个类对象在controller方法参数中封装前端提交过来的文件对象

具体代码如下图所示:

这里我们要注意的一点是:在上传文件的过程中,不排除会出现上传了相同名称的文件的情况。

所以为了防止出现文件重名从而导致原有的文件被覆盖,我们可以用UUID串来给文件取名

具体操作:

用UUID生成的随机字符串,拼接上获取的源文件名中的后缀名,作为上传后的文件名。

AliOssUtil.uploadFile()方法返回的是刚刚上传图片的访问地址。

AliOssUtil是我们自定义封装的工具类,便于后期整个项目的复用。

下面我们看看AliOssUtil类中对应的代码:

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.Bucket;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class AliOssUtil {
    // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
    private static final String ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com";
    private static final String ACCESS_KEY_ID="OSS秘钥ID";
    private static final String ACCESS_KEY_SECRET="OSS秘钥";
    // 填写Bucket名称,例如examplebucket。
    private static final String BUCKET_NAME = "examplebucket";
    /**
     *
     * @param objectName
     * @param in
     * @return  文件上传成功,返回访问地址
     * @throws Exception
     */
    public static String uploadFile(String objectName, InputStream in) throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID,ACCESS_KEY_SECRET);
        String url="";
        try {
            // 填写字符串。
            String content = "Hello OSS,你好世界";

            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, objectName, in);

            // 上传字符串。
            PutObjectResult result = ossClient.putObject(putObjectRequest);

            //url组成:https://bucket名称.区城节点/objectName
            url="https://"+ BUCKET_NAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;
        } 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();
            }
        }
        return url;
    }
}

详细请参考如下文档地址:

https://help.aliyun.com/zh/oss/developer-reference/simple-upload-11?spm=a2c4g.11186623.0.0.665f5c71boZCXiicon-default.png?t=N7T8https://help.aliyun.com/zh/oss/developer-reference/simple-upload-11?spm=a2c4g.11186623.0.0.665f5c71boZCXi

2、前端对应的Axios代码

import axios from 'axios'

const baseURL='http://127.0.0.1:8080';

const instance = axios.create({
  baseURL,
  //基础地址,超时时间
  timeout:10000,
})

export const userLoadAvatarService=(file)=>instance.post('/upload',file,{headers: {'Content-Type': 'multipart/form-data'}})

        当前端用户选择好文件并点击上传之后,浏览器就会调用我们封装好的userLoadAvatarSer方法,方法中的file参数是用户上传的文件对象,此时发送的Post请求会携带这个文件对象上传到后端。

注意 : 在使用axios实例中的post方法时,一定要在第三个参数位置加上下面的内容,不然后端会出现空指针异常

{headers: {'Content-Type': 'multipart/form-data'}}

 好了,今天分享到这里结束了

至此希望能够给你带来帮助(#^.^#)

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

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

相关文章

Histone H3K27ac Antibody, SNAP-ChIP® Certified

EpiCypher是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher(国内代理商欣博盛生物)推出的ChIP级别的Histone H3K27ac Antibody符合EpiCypher的“SNAP-ChIP Certified”标准,用于ChIP实验中的特异性和有效靶…

数据标准经验分享

给客户做数据类项目,在做数据标准时的经验分享 1. 收集本项目的数据范围内的数据 2. 整理本数据范围内的所有元数据 3. 观察该公司所有元数据的表命名、字段命名规律 4. 根据行业经验, 国标、行标, 也根据元数据范围,制定本公司…

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索 效果图定义子组件父组件应用 效果图 定义子组件 主要结合el-select和el-tree两个组件改造的。 <template><div class"selectTree"><el-select filterable :filter-method"filterMe…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-Video组件的使用(十)

一、Video组件的使用 1、概述 在手机、平板或是智慧屏这些终端设备上&#xff0c;媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集&#xff0c;还是视频的播放、切换、循环&#xff0c;亦或是相机的预览、拍照等功能&#xff0c;媒体组件都是必不可…

分割头篇 | 原创自研 | YOLOv8 更换 SEResNeXtBottleneck 头 | 附详细结构图

左图:ResNet 的一个模块。右图:复杂度大致相同的 ResNeXt 模块,基数(cardinality)为32。图中的一层表示为(输入通道数,滤波器大小,输出通道数)。 1. 思路 ResNeXt是微软研究院在2017年发表的成果。它的设计灵感来自于经典的ResNet模型,但ResNeXt有个特别之处:它采用…

EDI报文到Excel转换方案详解

EDI目前已广泛应用于电子、物流、汽车、零售等行业。 越来越多的交易伙伴要求建立EDI连接&#xff0c;通过EDI来对接上下游交易伙伴&#xff0c;收发业务单据。 当我们与新的交易伙伴建立EDI连接时&#xff0c;有多种实施方案可供选择&#xff0c;如果您的单据量较少&#xf…

游戏APP用户行为统计分析

文章目录 1.游戏业务数据分析如图所示的用户行为数据2.数据预处理2.1加载包2.2读取数据2.3查看安装信息2.4查看注册信息2.5查看安装信息表中的最大值&#xff0c;最小值等基本信息。2.6查看注册信息表中的最大值&#xff0c;最小值等基本信息。 3.数据分析3.1数据统一3.2安装信…

ADSelfService Plus 推出离线多因素身份验证以提升远程工作安全性

采用先进验证方法&#xff0c;确保在任何时间、地点或连接问题下对业务数据的合法访问即使远程用户未连接到身份验证服务器或互联网&#xff0c;也可通过MFA安全认证。 MFA 得克萨斯州德尔瓦雷 — 2023年5月3日 — Zoho Corporation 旗下的企业IT管理部门ManageEngine今日宣布…

做好测试用例的分析 ? 是做好软件测试的必要步骤。

目录 1.测试用例的分析指标 2.可能原因的论证 3.确定原因的解决方案 测试用例作为测试人员最重要的输出物之一 &#xff0c;它的作用不仅仅是能保证需求覆盖 &#xff0c;提高测试覆盖率等 。通过对执行后的测试用例分析 &#xff0c;你也可以发现更多在编写上&#xff0c;执…

【百度Apollo】本地调试仿真:加速自动驾驶系统开发的利器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

05 - 什么是路由协议

1 路由协议 路由协议&#xff08;英语&#xff1a;Routing protocol&#xff09;&#xff1a; 是一种指定数据包转送方式的网上协议。Internet网络的主要节点设备是路由器&#xff0c;路由器通过路由表来转发接收到的数据。 路由协议&#xff0c;根据转发策略进行分类&#xff…

C/C++ - 类的多态机制

目录 多态概念 多态定义 多态的触发机制 虚函数 虚函数表 虚析构函 虚析构函数声明 虚析构函数的作用 纯虚函数 纯虚函数的声明 纯虚函数的作用 抽象类 多态原理 虚函数表 & 虚函数指针 继承机制下的虚函数表 动态绑定 多态概念 狗狗发出的声音为 -> 旺…

Redis -- String 字符串, 计数命令,字符串操作

"学如逆水行舟&#xff0c;不进则退。" 目录 Redis的String字符串 常见命令 set get mget mset setnx setex psetex 计数命令 incr incrby decr decrby incrbyfloat 字符串操作 append getrange setrange strlen 小结 string内部编码 Redis…

web应用课——(第四讲:中期项目——拳皇)

代码AC Git地址&#xff1a;拳皇——AC Git链接

迁移学习实现图片分类任务

导入工具包 import time import osimport numpy as np from tqdm import tqdmimport torch import torchvision import torch.nn as nn import torch.nn.functional as Fimport matplotlib.pyplot as plt %matplotlib inline# 忽略烦人的红色提示 import warnings warnings.fi…

11.Ubuntu

目录 1. 什么是Ubuntu 1.1. 概述 1.2. Ubuntu版本简介 1.2.1. 桌面版 1.2.2. 服务器版 2. 部署系统 2.1. 新建虚拟机 2.2. 安装系统 2.3. 部署后的设置 2.3.1. 设置root密码 2.3.2. 关闭防火墙 2.3.3. 启用允许root进行ssh 2.3.4. 安装所需软件 2.3.5. 制作快照 …

企业图纸数据防泄密方案(图纸防泄密的几个实用方法)

在当今的商业环境中&#xff0c;企业图纸数据的重要性日益凸显。无论是产品设计、研发、生产还是项目管理&#xff0c;图纸都承载着企业的核心知识产权和商业机密。 然而&#xff0c;随着信息技术的迅猛发展&#xff0c;企业图纸数据泄密事件屡屡发生&#xff0c;给企业带来了…

【20240131】USB相机(查看设备列表、打开设备)

USB相机采集 1、v4l2查看设备列表2、查看具体设备信息3、在桌面打开USB相机 1、v4l2查看设备列表 打开终端&#xff0c;输入&#xff1a;v4l2-ctl --list-devices usb设备在Webcam: Webcam栏&#xff0c;分别是video9和video10&#xff0c;下一步&#xff1a;确定哪一个是接入…

存内计算——发展史与近期成果

存内计算的概念早在上个世纪就已经被提出&#xff0c;但当时的人们寄希望于通过优化处理器设计以及工艺制程的升级&#xff0c;来获得性能和能效比的提升&#xff0c;存内计算的研究仅停留在理论阶段。随着大数据时代的到来&#xff0c;存内计算由于其结构特点以及摩尔定律的“…

机器学习 低代码 ML:PyCaret 的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…