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

news2024/12/20 7:37:47

 上传文件的基本操作

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法

GraphReader: 将长文本结构化为图&#xff0c;并让 agent 自主探索&#xff0c;结合的大模型长文本处理增强方法 论文大纲理解为什么大模型和知识图谱不够&#xff1f;还要多智能体 设计思路数据分析解法拆解全流程核心模式提问为什么传统的长文本处理方法会随着文本长度增加而…

HTTP接口报错详解与解决 200,500,403,408,404

前言&#xff1a; 仅做学习记录&#xff0c;侵删 背景 当后端编写接口时&#xff0c;经常需要对接口使用ApiFox或者PostMan进行测试&#xff0c;此时就会出现各种各样的报错&#xff0c;一般都会包括报错编码&#xff1a;200,400,401等。这个状态码一般是服务器所返回的包含…

智能光学计算成像技术与应用

智能光学计算成像是一个将人工智能&#xff08;AI&#xff09;与光学成像技术相结合的前沿领域&#xff0c;它通过深度学习、光学神经网络、超表面光学&#xff08;metaphotonics&#xff09;、全息技术和量子光学等技术&#xff0c;推动光学成像技术的发展。以下是智能光学计算…

QT基础和练习

基础应用&#xff1a;MyWidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->resize(960,720); /*//qDebug//1、类似与printf&#xff08;&#xff09;的使用qDebug("%s","hello world");//2、类…

【数据集】生菜病害检测数据集530张6类YOLO+VOC格式

数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;530 Annotations文件夹中xml文件总计&#xff1a;530 labels文件夹中txt文件总计&#xff1a;530 标签种类数&#…

如何用波特五力模型分析竞争环境?

这是个好问题啊&#xff01; 你要用波特五力模型分析竞争环境&#xff0c;就得先知道—— 什么是波特五力模型&#xff1f; 波特五力模型&#xff08;Porters Five Forces&#xff09;是由哈佛大学教授迈克尔波特&#xff08;Michael Porter&#xff09;提出的一个行业竞争分…

[spring]实例化对象(静动态工厂)

在前面文章的例子当中&#xff0c;我们都创建了Bean对象。spring里常用的获取类的实例化对象有几种方式&#xff1a;构造函数获取Bean对象、静态和动态工厂获取Bean对象、实现FactoryBean规范。 因为一些步骤没有什么别的不同&#xff0c;所以我不会重复去讲&#xff0c;届时会…

三、ubuntu18.04安装docker

1.使用默认ubuntu存储库安装docker 更新软件存储库 更新本地软件数据库确保可以访问最新版本。打开终端输入&#xff1a;sudo apt-get update 卸载旧版本的docker 建议继续之前卸载任何旧的docker软件。打开终端输入&#xff1a;sudo apt-get remove docker docker-engine …

Java JDK8之前传统的日期时间-Date、SimpleDateFormat、Calendar

1. Date (1) Date代表的是日期和时间 (2) 常见构造器和常用方法 构造器说明public Date()创建一个Date对象&#xff0c;代表系统当前日期和时间public Date(long time)根据传入的时间毫秒值创建一个Date对象 方法说明public long getTime()返回从1970.1.1 00:00:00到此时的毫…

Android简洁缩放Matrix实现图像马赛克,Kotlin

Android简洁缩放Matrix实现图像马赛克&#xff0c;Kotlin 原理&#xff0c;通过Matrix把一个原图缩小到原先的1/n&#xff0c;然后再把缩小后的小图放大n倍&#xff0c;自然就是马赛克效果&#xff08;相当于是放大后像素“糊”成一片了&#xff09;。 import android.content.…

Luma 视频生成 API 对接说明

随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平台&#xff0c;用户只需上传素…

解锁移动设备管理新技能-RayLink远程控制手机

在这个忙碌的现代社会中&#xff0c;智能手机已经成为我们生活的重要组成部分&#xff0c;它们不再仅仅是通讯工具&#xff0c;而是我们日常生活的核心。随着这种变化&#xff0c;远程控制手机的技术应运而生&#xff0c;为我们开启了一个全新的移动设备管理时代。今天&#xf…

<论文>初代GPT长什么样?

一、摘要 今天我们聊一下论文《Improving Language Understanding by Generative Pre-Training》以及它所提出来的预训练模型——GPT1。我们知道Bert在出道那会儿红极一时&#xff0c;但实际上GPT1比Bert还要早几个月就出道了&#xff0c;而且同样刷新了当时的多个任务记录。GP…

flutter 快速实现侧边栏

首先我们写一个侧边栏工具类&#xff0c;示例如下&#xff1a; import package:flutter/material.dart;class Sidebar extends StatelessWidget {overrideWidget build(BuildContext context) {return Drawer(child: ListView(padding: EdgeInsets.zero,children: <Widget&…

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…

[SZ901]FPGA程序固化工具使用方法

工具为脚本形式&#xff0c;前期需进行vivado版本&#xff0c;下载器端口配置 1&#xff0c;编辑 【SZ901程序固化工具.bat】&#xff0c;设置软件版本 修改软件版本和安装路径 2&#xff0c;设置下载器端口&#xff08;SZ901->USER_TCL->FlashBurn_Config.tcl&#x…

详解Redis的String类型及相关命令

目录 SET GET MGET MSET SETNX SET和SETNX和SETXX对比 INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN 内部编码 SET 将 string 类型的 value 设置到 key 中。如果 key 之前存在&#xff0c;则覆盖&#xff0c;⽆论原来的数据类型是什么…

【时间之外】IT人求职和创业应知【71】-专利费

目录 2025 ICT产业趋势年会召开&#xff0c;2024年度ICT十大新闻重磅揭晓 海纳致远数字科技申请定制化插件驱动的数据分析专利 阿波罗智联取得语音数据的处理方法、装置、设备和存储介质专利 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0…

生态学研究中,森林生态系统的结构、功能与稳定性是核心研究

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

MySQL追梦旅途之慢查询分析建议

一、找到慢查询 查询是否开启慢查询记录 show variables like "%slow%";log_slow_admin_statements&#xff1a; 决定是否将慢管理语句&#xff08;如 ALTER TABLE 等&#xff09;记录到慢查询日志中。 log_slow_extra &#xff1a; MySQL 和 MariaDB 中的一个系…