springboot中Controller内文件上传到本地以及阿里云

 上传文件的基本操作

<form action="/upload" method="post" enctype="multipart/form-data">  
    <h1>登录</h1>  
    姓名:<input type="text" name="username" required><br>  
    年龄:<input type="text" name="age" required><br>  
    头像:<input type="file" name="file" required><br>  
    <input type="submit" value="提交">  
</form>  
// Java接收前端发来的文件

@RestController
public class UploadController {
    private static final ch.qos.logback.classic.Logger log = (Logger) LoggerFactory.getLogger(UploadController.class);
    @PostMapping(path = "/upload")
    public Result upload(String username, Integer age, MultipartFile file){
        log.info("接收参数:" + username + age + file);
        return Result.success();
    }
}

 注意:springboot项目启动后,打开这个index.html的页面要输入:localhost:8080/index.html

接下来通过断点调试获取查看前端发送过来的文件 

 文件的”到此一游“该文件所在的路径的文件夹是个临时文件夹,运行完毕后这个文件夹里的内容清空

 前端上传文件本地存储

@PostMapping("/upload")
    public Result upload(String name, Integer age, MultipartFile file) throws IOException {
        // 记录接收到的参数,包括姓名、年龄和文件
        log.info("接收参数: {}, {}, {}", name, age, file);

        // 获取上传文件的原始文件名
        String originalFilename = file.getOriginalFilename();

        // 将文件保存到指定路径(D:/images/)并命名为原始文件名
        file.transferTo(new File( "D:/idea/javacode/web/Getdata/" + originalFilename));

        // 返回成功结果
        return Result.success();
    }

文件上传还存在一个要考虑的问题:如果两次提交的是不一样的文件,但是文件名称一样,那么第二次提交的图片会把第一次提交的文件给替换(覆盖)因此可以使用UUID命名来解决。

生成UUID

import java.util.UUID;  

public class UUIDExample {  
    public static void main(String[] args) {  
        // 生成一个随机UUID  
        UUID uuid = UUID.randomUUID();  
        
        // 输出UUID  
        System.out.println("生成的UUID: " + uuid.toString());  
    }  
}

使用UUID解决以上问题
 

@PostMapping("/upload")  
public Result upload(String name, Integer age, MultipartFile file) throws IOException {  
    // 记录接收到的参数,包括姓名、年龄和文件  
    log.info("接收参数: {}, {}, {}", name, age, file);  
    
    // 获取上传文件的原始文件名,例如 "1.jpg" 或 "22.2.2.2.png"  
    String originalFilename = file.getOriginalFilename();  
    
    // 获取文件扩展名,从最后一个点后开始截取  
    String extension = originalFilename.substring(originalFilename.lastIndexOf("."));  
    
    // 生成新的文件名,使用UUID并加上文件扩展名  
    String newFileName = UUID.randomUUID().toString() + extension;  
    
    // 将文件保存到指定路径(D:/images/)并命名为新的文件名  
    file.transferTo(new File("D:/images/" + newFileName));  
    
    // 返回成功结果  
    return Result.success();  
}
file.transferTo(new File("D:/idea/javacode/web/Getdata/" + newFileName));

这个代码的路径最后一定要写个“/”,使得文件保存在那个文件夹下。

上传文件大小限制

默认上传文件的最大大小为1MB,超过该大小需要在配置文件配置

servlet:  
    multipart:  
# 最大单个文件大小  
        max-file-size: 10MB  
# 最大请求大小(包括所有文件和表单数据)  
        max-request-size: 100MB

阿里云OSS

阿里云对象存储oss(object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用oss

您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

 具体怎么配看:视频icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1yGydYEE3H?spm_id_from=333.788.videopod.episodes&vd_source=3c46a0d84476a55380be0c2ddd012af1&p=106

配置好相关密钥等配置后,创建bucket。接下来可以通过Java代码将自己电脑本地的文件上传到阿里云。

添加好下面的依赖

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

 具体的上传文件的代码

 public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException {
        /**
         * 基础配置:连接服务并验证个人身份
         */
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "q-buckets";

        /**
         * 配置具体文件上传信息
         */
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "ph.webp"; // 可以修改名字
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        String filePath= "D:\\Mycode\\webcode\\imag\\nu.webp";

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

        try {
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传文件。
            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();
            }
        }
    }

这样就可以在自己阿里云的bucket里面看到上传的文件 

参考:后端之路 

文件上传操作整合为工具类并在Controller中使用

具体代码如下

@Component // 方便依赖注入
public class AliyunOSSOperation {  
    // 指定阿里云OSS的服务地址,这里是深圳区域的地址  
    private String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";  
    // 指定要上传到的存储桶名称  
    private String bucketName = "lwq-buckets";   
    // 指定阿里云的区域,这里是深圳区域  
    private String region = "cn-shenzhen";   

    /**  
     * 上传文件到阿里云OSS  
     * @param content 文件的字节数组内容  
     * @param originalFilename 原始文件名,用于生成新的文件名  
     * @return 上传后文件的访问路径  
     * @throws Exception 可能抛出的异常  
     */  
    public String upload(byte[] content, String originalFilename) throws Exception {  
        // 从环境变量中获取访问密钥,确保在运行代码前设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET  
        EnvironmentVariableCredentialsProvider credentialsProvider =   
            CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();  
        
        // 获取object对象路径,例如2024/06/21.png。Object类型中不能包含Bucket名称  
        String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));  

        // 生成一个新的文件名,使用UUID确保唯一性,并保留原始文件的扩展名  
        String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));  
        String objectName = dir + "/" + newFileName; // 生成完整的对象名称  

        // 创建OSSClient实例  
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();  
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // 设置签名版本为V4  

        // 使用OSSClientBuilder创建OSS客户端实例,配置包括端点、凭证提供者、客户端配置和区域  
        OSS ossClient = OSSClientBuilder.create()  
                .endpoint(endpoint)  
                .credentialsProvider(credentialsProvider)  
                .clientConfiguration(clientBuilderConfiguration)  
                .region(region)  
                .build();  

        try {  
            // 上传文件内容到指定的存储桶和对象路径  
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));  
        } finally {  
            // 确保无论上传是否成功,都会关闭OSS客户端  
            ossClient.shutdown();  
        }  

        // 生成并返回文件的完整访问路径  
        return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;  
    }  
}

使用该类 

@Autowired // 自动注入AliyunOSSOperator实例  
private AliyunOSSOperator aliyunOSSOperator;  

@PostMapping("/upload") // 定义一个POST请求处理方法,映射到/upload路径  
public Result upload(MultipartFile file) throws Exception {  
    // 记录上传文件的原始文件名到日志  
    log.info("文件上传: {}", file.getOriginalFilename());  
    
    // 调用aliyunOSSOperator的upload方法,将文件字节和文件名上传到OSS  
    String url = aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename());  
    
    // 记录文件上传后返回的URL到日志  
    log.info("文件上传OSS, url: {}", url);  
    
    // 返回上传结果,包含文件的访问URL  
    return Result.success(url);  
}

这样上传到阿里云的文件以年月划分了文件夹 

参数配置进一步优化

  • 指将一些需要灵活变化的参数,配置在配置文件中,然后通过 @Value 注解来注入外部配置的属性。
  • aliyun:  
      oss:  
        endpoint: https://oss-cn-beijing.aliyuncs.com  
        bucketName: java-ai  
        region: cn-beijing

    以上配置信息配置在yml文件中

  •     @Value("${aliyun.oss.endpoint}")  
        private String endpoint;  
    
        @Value("${aliyun.oss.bucketName}")  
        private String bucketName;  
    
        @Value("${aliyun.oss.region}")  
        private String region;  

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

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

相关文章

python 曲线拟合,曲线拟合交点

目录 效果图: 源代码: 效果图: 源代码: import json import os import shutilimport cv2 import numpy as npfrom numpy.polynomial.polynomial import Polynomialdef calculate_distance(x1, y1, x2, y2):return np.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)def get_new_g…

java 集合对象

Java 基础之集合_java集合继承关系图-CSDN博客 集合可以有序或无序&#xff0c;重复或不能重复&#xff0c;空或不能空。 List<> 集合&#xff0c;是有序&#xff0c;允许重复元素&#xff0c;允许空元素 1、ArrayList<> 非线程安全 2、LInkedList<> 非线…

【零基础学习UDS诊断测试】——0x27测试用例设计

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 1.概述 2.响应情况 3.测试点解析 4.0x27诊断调查表 5.详细用例展示 1.概述 UDS(统一诊断服务)中的0x27服务,即安全访问服务(Security Access Service),其主要作用…

【BUG记录】Apifox 参数传入 + 号变成空格的 BUG

文章目录 1. 问题描述2. 原因2.1 编码2.2 解码 3. 解决方法 1. 问题描述 之前写了一个接口&#xff0c;用 Apifox 请求&#xff0c;参数传入一个 86 的电话&#xff0c;结果到服务器 就变成空格了。 Java 接收请求的接口&#xff1a; 2. 原因 2.1 编码 进行 URL 请求的…

视频直播点播平台EasyDSS推拉流技术结合无人机推流在道路交通巡检场景中的应用

随着城市化进程的加速&#xff0c;交通网络日益复杂&#xff0c;交通巡检工作面临着前所未有的挑战。传统的巡检方式往往依赖于人工巡查或地面监控设备&#xff0c;但这些方法存在巡检范围有限、效率低下等缺点。 无人机凭借其高空视野、灵活机动、实时监控等优势&#xff0c;…

git仓库的基本概念和流程以及一些基本命令

什么是版本库&#xff1f;版本库又名仓库&#xff0c;英文名repository,你可以简单的理解一个目录&#xff0c;这个目录里面的所有文件都可以被Git管理起来&#xff0c;每个文件的修改&#xff0c;删除&#xff0c;Git都能跟踪&#xff0c;以便任何时刻都可以追踪历史&#xff…

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…

2024技能大赛Vue流程复现

1. 关于版本的控制 vue/cli 5.0.8vscode 最新下载版本 2. 创建vuecli项目 若没有安装vuecli则可以先安装 npm install -g vue/cli # 默认下载最新版本。vue --version vue -V # 查看版本&#xff0c;两个选一 使用vuecli来创建一个新的vue项目&#xff0c;vs code打开…

Qwen2.5-7B-Instruct FastApi部署与调用

Qwen2.5-7B-Instruct FastApi 部署调用 环境准备 本文基础环境如下&#xff1a; ---------------- ubuntu 22.04 python 3.12 cuda 12.1 pytorch 2.3.0 ----------------本文默认学习者已安装好以上 Pytorch(cuda) 环境&#xff0c;如未安装请自行安装。 首先 pip 换源加速下…

【Vue3学习】ref,reactive,toRef,toRefs的功能与用法区别

在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中&#xff0c;ref、reactive、toRef 和 toRefs 是四个非常重要的工具函数&#xff0c;用于创建和管理响应式数据。 一、ref 用ref()包裹数据,返回的响应式引用对象&#xff0c;包含一个 .value 属性&#xff0…

【面试 - 遇到的问题】Vue 里 router-view 使用 key + 关闭页面后重新打开页面-获取的数据赋值到旧组件问题(钩子执行顺序)

目录 【1】问题描述【2】问题排查前 - 页面渲染、tag 页签渲染 逻辑梳理页面渲染【借用别人的描述】<router-view :key"key" />1. 不设置key 属性2. 设置 key 属性值为 $route.path/page/1 > /page/2/page?id1 > /page?id2, 3. 设置 key 属性值为 $rou…

电商商品详情API接口(item get)数据分析上货

电商商品详情API接口&#xff08;item get&#xff09;在数据分析与商品上货方面发挥着重要作用。以下是对这两个方面的详细探讨&#xff1a; 一、数据分析 数据源获取&#xff1a; 商品详情API接口提供了丰富的数据源&#xff0c;包括商品的标题、价格、库存、描述、图片、用…

【计算机网络】期末考试预习复习|中

作业讲解 转发器、网桥、路由器和网关(4-6) 作为中间设备&#xff0c;转发器、网桥、路由器和网关有何区别&#xff1f; (1) 物理层使用的中间设备叫做转发器(repeater)。 (2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。 (3) 网络层使用的中间设备叫做路…

大数据与AI:从分析到预测的跃迁

引言&#xff1a;数据时代的新纪元 从每天的社交分享到企业的运营决策&#xff0c;数据早已成为现代社会不可或缺的资源。我们正置身于一个数据爆炸的时代&#xff0c;数以亿计的信息流实时生成&#xff0c;为人类带来了前所未有的洞察能力。然而&#xff0c;数据的价值并不仅限…

CSDN数据大屏可视化【开源】

项目简介 本次基于版本3 开源 版本3开源地址&#xff1a;https://github.com/nangongchengfeng/CsdnBlogBoard.git 版本1开源地址&#xff1a;https://github.com/nangongchengfeng/CSDash.git 这是一个基于 Python 的 CSDN 博客数据可视化看板项目&#xff0c;通过爬虫采…

产品品牌战略升级!原WorkPlus正式改名为BeeWorks,版本重要更新

尊敬的各位合作伙伴、用户朋友&#xff1a; 感谢大家一直来对恒拓高科的大力支持&#xff01; 为了配合公司战略业务的实施和后续品牌规划的发展&#xff0c;自2024年12月18日起&#xff0c;恒拓高科旗下安全专属的移动数字化平台“WorkPlus”正式更名为“BeeWorks”&#xf…

jvm栈帧中的动态链接

“-Xss”这一名称并没有一个特定的“为什么”来解释其命名&#xff0c;它更多是JVM&#xff08;Java虚拟机&#xff09;配置参数中的一个约定俗成的标识。在JVM中&#xff0c;有多个配置参数用于调整和优化Java应用程序的性能&#xff0c;这些参数通常以一个短横线“-”开头&am…

R语言混合模型回归GBTM群组轨迹模型绘图可视化研究

全文链接&#xff1a;https://tecdat.cn/?p38581 在回归分析的广袤领域中&#xff0c;面对具有多条未知函数线的复杂数据时&#xff0c;传统方法常常捉襟见肘。混合模型作为一种强有力的分析手段应运而生&#xff0c;其在处理此类复杂情境时展现出独特的优势与潜力&#xff08…

基于 HC_SR04的超声波测距数码管显示(智能小车超声波避障部分)

超声波测距模块HC-SR04 1、产品特色 ①典型工作用电压&#xff1a;5V ②超小静态工作电流&#xff1a;小于 5mA ③感应角度(R3 电阻越大,增益越高,探测角度越大)&#xff1a; R3 电阻为 392,不大于 15 度 R3 电阻为 472, 不大于 30 度 ④探测距离(R3 电阻可调节增益,即调节探测…

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法&#xff08;一&#xff09;修改颜色&#xff08;二&#xff09;修改大小&#xff08;三&#xff09;换行&#xff08;四&…