9、JavaWeb-文件上传-配置文件

news2024/11/19 20:28:46

P146 案例-文件上传-简介

文件上传,将本地图片、视频等文件上传到服务器,供其他用户浏览下载的过程。

文件上传前端页面三要素:

在这里插入图片描述

如果前端表单的编码格式选择的默认编码方式x-www.form-urlencoded,则提交的文件仅仅是文件名,文件内容没有提交到服务端,所以表单编码方式应该选择multipart/form-data,不然不能提交真正的文件内容。

图片、音频上传后文件内容可能是乱码。

服务端如何接收上传文件呢?

例如:springboot当中提供了multipartfile这个api,利用这个api可以接收上传文件,注意保证参数名和前端属性名一致。

在这里插入图片描述

P147、148、149、150 案例-文件上传-本地存储-OSS存储

服务端接收后是临时文件,之后就清除了。

两种存储方案:

1、本地存储

将文件存储在本地服务器磁盘中,multipartfile提供了保存磁盘的方法transferto。

下面是使用案例:

 @PostMapping("/upload")
    public Result upload(String name, Integer age, MultipartFile image) throws Exception{
        log.info("文件上传:{}, {}, {}",name, age, image);
        // 获取原始文件名
        String originalFilename = image.getOriginalFilename();
        image.transferTo(new File("E:\\mycodes\\ideaProject\\javaweb\\javaweb_project\\springboot-tlias\\springboot-tlias\\src\\main\\resources\\img\\"+originalFilename));
        return Result.success();
    }

对上述操作优化:如果直接采用原始名存储,则会造成存在相同名称的文件会相互冲突,后来的文件会覆盖掉前面的文件,因此需要保证每一个文件是唯一的,如何构造唯一的文件名?

时间戳也不一定,采用uuid解决。

uuid:通用唯一识别码,长度固定的字符串且不重复,

//    uuid示例
//    java.util中有UUID工具类
    @Test
    public void testUuid(){
    for (int i = 0; i < 100; i++){
        String s = UUID.randomUUID().toString();
        System.out.println(s);

    }
    }

输出如下所示:输出32位,4个-,总长36位,

在这里插入图片描述

但是uuid不存在文件名后缀,所以需要添加文件扩展名,如何获取文件扩展名?截取.之后的

因此使用UUID改进后的方法如下所示:

 @PostMapping("/upload")
    public Result upload(String name, Integer age, MultipartFile image) throws Exception{
        log.info("文件上传:{}, {}, {}",name, age, image);
        // 获取原始文件名
        String originalFilename = image.getOriginalFilename();
        // 获取文件扩展名,即.之后的
        int index = originalFilename.lastIndexOf(".");
        // 从index截取到尾部获得扩展名
        String extname = originalFilename.substring(index);
        String newFileName = UUID.randomUUID().toString() + extname;
        log.info("获取到新的文件名:{}", newFileName);
        image.transferTo(new File("E:\\mycodes\\ideaProject\\javaweb\\javaweb_project\\springboot-tlias\\springboot-tlias\\src\\main\\resources\\img\\"+newFileName));
        return Result.success();
    }

能够成功以UUID保存文件

默认情况下上传文件不能超过超过1M,否则会报错,如果需要上传大文件,可以进行如下配置:在Properties中

# 配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB

# 配置单个请求最大上传大小,一次请求可上传多个 文件
spring.servlet.multipart.max-request-size=100MB

存储本地磁盘缺点:

  • 无法直接访问本地

  • 服务器磁盘满了不方便扩容

  • 如果磁盘坏了则会造成损失

multipartfile常用方法:

  • String getOriginalFilename()获取原始文件名

  • void transferTo(File dest)将接收的文件转存到磁盘文件中

  • long getSize()获取文件的大小,单位为字节

  • byte[] getBytes()获取文件内容的字节数组

  • InputStream getInputStream()获取接收到的文件内容的输入流

不用本地存储,常用

  • 项目组自己搭建的文件存储服务,例如分布式服务或集群

  • 使用云服务,方便可靠

2、云存储

阿里云,“云”即互联网,云服务即通过互联网提供各种各样的服务。

OSS对象存储服务,object storage service,可通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

您可以进行以下操作:

  • 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。

  • 通过获取已上传文件的地址进行文件的分享和下载。

  • 通过修改存储空间或文件的属性或元信息来设置相应的访问权限。

  • 在阿里云管理控制台执行基本和高级OSS任务。

  • 使用阿里云开发工具包或直接在应用程序中进行RESTful API调用执行基本和高级OSS任务

学习如何使用云服务。

第三方服务通用思路:

  • 准备工作

  • 参照官方SDK编写入门程序

  • 集成使用

bucket是阿里云OSS中的存储空间,即用户存储对象的容器,所有的对象都必须隶属于某个存储空间。使用步骤

在这里插入图片描述

可在官方使用文档中进行查看手册,创建好bucket之后,在项目中引入依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.15.1</version>
</dependency>

编写测试单元进行测试,参照文件流上传示例,下面是核心操作

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

        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (OSSException oe) {

完整如下:可以上传成功,并且上传的每个文件还有可访问的url。

@Test
    public void testOss(){
        String endpoint = "oss-cn-beijing.aliyuncs.com"; // 查询阿里云bucket
        String accessKeyId = "";
        String accessKeySecret = "";
        String bucketName = "hemastudy";
        String objectName = "0001.jpg";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "E:\\download\\3bi4.jpg";

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

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

使用标签展示图片。

实现阿里云上传的工具类,调用上传方法返回url。可将该类加到IOC容器管理,添加注解@Component。注意自己修改endpoint要加上https://

/**
 * 阿里云 OSS 工具类
 */
public class AliOSSUtils {

    private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    private String accessKeyId = "LTAI4GCH1vX6DKqJWxd6nEuW";
    private String accessKeySecret = "yBshYweHOpqDuhCArrVHwIiBKpyqSL";
    private String bucketName = "web-tlias";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

使用方法:

    @PostMapping("/upload1")
    public Result upload(MultipartFile image) throws IOException {
        String url = aliOSSUtils.upload(image);
        return Result.success();
    }

小结:

  • 了解文件上传,文件上传前端页面三要素

  • 服务端接收文件Multipartfile

  • 文件存储

P151、P152 案例-修改员工-查询回显

修改员工两步:先要依据点击的记录请求服务端返回数据用于页面回显展示,保存需要更新数据。

查询回显:按照id进行查询即可。

修改员工采用动态SQL,使用判断是否需要更新。

P153 案例-配置文件-参数配置化

springboot的配置文件。

问题分析,怎样将一些参数的设置进行集中管理?

配置文件一般只有一个,可以考虑将参数定义在配置文件中,kye=value的形式。

如果在类中需要使用这些参数的话,如何读取到?方式是通过IO流来读取配置文件,解析配置文件中的值,然后为类中成员赋值。

上述方法在springboot中已经解决了,提供了一个注解@value,用于外部配置的属性注入,具体用法@value("${配置文件中的key}")

多行编辑,alt+鼠标左键,

例如:

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

P154 案例-配置文件-yml配置文件

springboot中提供了多种属性配置方式:

  • application.properties:key = value的形式

  • application.yml

  • application.yaml ,两者配置形式相同,配置形式为key:value

例如设置内嵌的tomcat端口号修改为9000

server:
  port: 9000
  address:

下面是常见的配置文件格式对比:推荐使用yml格式的配置文件

在这里插入图片描述

yml格式的基本语法

  • 大小写敏感

  • 数值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系,缩进时不允许使用Tab键,只能用空格

  • 缩进的空格数不重要,相同层级的元素左侧对齐

  • #表示注释,

yml中常见的数据格式:

  • 对象/Map集合,例如

user:
name: xxx
age: 12
password: xxx



- 数组/List/Set集合

  ```YAML
hobby:
  - java
  - C
  - game
  - sport

使用yml配置文件同样可以运行。

P155 案例-配置文件-@Configuration

如果采用value注解注入配置文件中的参数,当比较多的时候则会比较繁琐、臃肿。

springboot中有解决,可以自动将配置文件中的值自动注入到需要的类成员中,注意key需要对应,并且为实体类属性提供get、set方法,并将实体类交给IOC容器管理,如果有前缀则要添加,则前面的aliossutils可以修改为如下形式:

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOssproperties {
    private String endpoint;
    private String accessKeyId;
    private String ccessKeySecret;
    private String ucketName;
}


// 在使用的 时候直接注入bean对象即可

需要引入依赖:自动识别被configurationproperties标识的对象

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
  </dependency>

@ConfigurationProperties与@Value的区别:

在这里插入图片描述

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

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

相关文章

【Linux进阶之路】网络 —— “?“ (下)

文章目录 前言一、概念铺垫1.TCP2.全双工 二、网络版本计算器1. 原理简要2. 实现框架&&代码2.1 封装socket2.2 客户端与服务端2.3 封装与解包2.4 请求与响应2.5 对数据进行处理2.6 主程序逻辑 3.Json的简单使用 总结尾序 前言 在上文我们学习使用套接字的相关接口进行了…

Python实现广义泊松模型(GeneralizedPoisson算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义泊松模型&#xff08;Generalized Poisson Model&#xff09;是一种统计学中用于处理数据的分析方…

MATLAB环境下滚动轴承复合故障仿真信号及时频谱

滚动轴承是一种广泛应用于各类旋转机械的通用基础部件&#xff0c;其运行状态的正常与否往往会对于整台机器的寿命、可靠性和精度等性能产生直接的影响。据统计&#xff0c;旋转机械中30%的故障和大型异步电机中44%的故障是由故障轴承引起的&#xff0c;而位于轴承内圈和外圈的…

浏览器的缓存导致的问题

同一个网站 频繁回退进入&#xff0c;音频播放器失效等问题问题 1.打开浏览器-更多工具-任务管理器 2.可以看到缓存页面进程 3.频繁回退进入 就会出现问题 解决方法&#xff1a; try {var bfWorker new Worker(window.URL.createObjectURL(new Blob([1])));window.addEvent…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来&#xff0c;全球范围内…

Python 匿名函数lambda()详解

一、匿名函数定义 lambda 函数是一个匿名函数&#xff08;即&#xff0c;没有名称定义&#xff09;&#xff0c;它可以接受任意数量的参数&#xff0c;但与普通函数不同&#xff0c;它只计算并返回一个表达式 二、匿名函数语法 lambda arguments&#xff08;参数&#xff09;: …

Qt初识 - 编写Hello World的两种方式 | 对象树

目录 一、通过图形化方式&#xff0c;在界面上创建出一个控件 二、通过代码方式&#xff0c;创建Hello World 三、Qt 内存泄漏问题 (一) 对象树 一、通过图形化方式&#xff0c;在界面上创建出一个控件 创建项目后&#xff0c;打开双击forms文件夹中的ui文件&#xff0c;可…

RFID-科技的“隐秘耳语者”

RFID-科技的“隐秘耳语者” 想象一下&#xff0c;你身处一个光线昏暗的环境中&#xff0c;周围的一切都被厚厚的阴影笼罩。这时&#xff0c;你需要识别并获取一个物体的信息&#xff0c;你会选择怎么做&#xff1f;是点亮灯光&#xff0c;用肉眼仔细观察&#xff0c;还是打开扫…

JetPack入门

先导入依赖 implementation("androidx.lifecycle:lifecycle-extensions:2.2.0") 1.使用LifeCycle解耦页面与组件 Activity package com.tiger.lifecycle;import android.annotation.SuppressLint; import android.os.Bundle; import android.os.SystemClock; impo…

【粉丝福利】探秘内部审计数字化之道:精准解析转型方法与成功路径

&#x1f33c;前言 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据进行挖掘、分析和应…

力资源视角的数字化应用

人力资源视角的数字化应用 随着科技的不断发展&#xff0c;数字化应用已经渗透到我们生活的方方面面&#xff0c;而人力资源管理也不例外。从招聘到员工培训&#xff0c;从绩效管理到薪酬福利&#xff0c;数字化应用正在彻底改变人力资源的工作方式和流程。本文将从人力资源的…

【探索Linux】—— 强大的命令行工具 P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )

阅读导航 引言一、socket 常见API表二、函数详细介绍01. socket()02. bind()03. listen()04. accept()05. connect()06. send()07. recv()08. close()09. select()10. getaddrinfo()11. sendto()12. recvfrom()13. setsockopt()14. getsockopt()15. shutdown()16. inet_pton()1…

【C语言】InfiniBand驱动mlx4_init和mlx4_cleanup

一、中文注释 Linux内核模块的初始化和清理过程&#xff0c;针对一个称为mlx4的网络设备驱动。以下是代码的逐行中文注释&#xff1a; static int __init mlx4_init(void) {int ret;if (mlx4_verify_params())return -EINVAL; // 检查设备参数是否有效&#xff0c;无效则返回…

管理者和员工之间缺乏有效的沟通,导致双方对绩效目标和期望存在误解,怎么办?

管理者和员工之间缺乏有效的沟通&#xff0c;导致双方对绩效目标和期望存在误解&#xff0c;这是绩效管理中一个常见且棘手的问题。这种沟通障碍可能源于多个方面&#xff0c;例如双方对绩效管理的理解不同、沟通方式不当或缺乏定期的沟通机制等。 当管理者和员工对绩效目标和…

AI产品摄影丨香水

AI电商产品拍摄丨&#xff08;可指定产品&#xff09; 均为概念图 可换产品 可指定产品&#xff0c;可换logo 工具&#xff1a;StartAI 搭配“手机摄影”风格使用效果更佳哦 咒语&#xff1a;anha perfume in bottle on stone surface, in the style of everyday american…

大运集团选用泛微数字化运营平台,构建丰富应用,业务协同

大运集团有限公司创建于1987年&#xff0c;位于山西省运城经济技术开发区&#xff0c;是集汽车、摩托车研发、制造、销售、服务及国际贸易、物流配送、工程建设等为一体的跨地区、跨行业、多元化发展的大型民营企业集团。 &#xff08;图片素材来自大运集团官网&#xff09; 集…

Linux内存映射

目录 背景 一、什么是内存映射&#xff1f; 二、mman函数 1.权限问题 2.总线错误 3.内存权限 4.读文件内容 5.映射与文件 6.非法参数错误 7.偏移量大小 8.映射内存大小 8.1 申请6k,访问5k 8.2 申请2k&#xff0c;访问3k 8.3 返回值检查 三、内存映射实现 四…

【Windows】VMware虚拟机应用(二):安装ubuntu-14.04.4

一、下载安装包 ubuntu-14.04.4-server-amd64.iso 注&#xff1a;因为我是用已有的安装包&#xff0c;所以&#xff0c;这里就不写下载步骤了。 二、安装引导 以管理员身份运行 VMware Workstation Pro 注&#xff1a;如果不是管理员身份运行&#xff0c;在安装系统时会出现…

Redis入门到实战-黑马程序员

文章目录 Redis安装与启动Redis的安装启动RedisRedis客户端Redis通用命令key的层级格式 Redis五种数据类型StringHashListSetSortedSet Redis安装与启动 Redis的安装 Redis是基于C语言编写的&#xff0c;因此首先需要安装Redis所需要的gcc依赖&#xff1a; Linux安装Redis步…

能源管理系统是怎么实现节能减排的?

在这个环保意识日益增强的时代&#xff0c;我们都在寻找更智能、更绿色的生活方式。你是否想过&#xff0c;家里的电表、空调、照明系统其实可以协同工作&#xff0c;帮助我们节约能源&#xff0c;减少碳足迹呢&#xff1f;这就是神奇的能源管理系统在发挥作用&#xff01; 能…