JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客!

在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。

让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!

目录

一、简介

1、什么是文件上传?

2、文件上传需要的两部分

①前端程序

②后端程序

3、举例

4、总结

二、本地存储

1、什么是本地存储?

2、初步代码

3、思考此时存在的问题

①不能以文件原始名称的形式存储

4、使用UUID来保证文件不被覆盖(唯一性)

①什么是UUID?

②截取原始文件名的后缀,并拼接上UUID,构成新文件名(唯一的)

③测试效果

5、目前仍存在的问题

①上传文件的大小有限制

②问题的原因

③配置好以后,再次上传那个2.84MB的图片,看看能否成功

6、MultipartFile的方法

7、本地存储文件的缺点

结语


一、简介

1、什么是文件上传?

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

        举例:发微博、微信朋友圈都需要用到文件上传功能。

2、文件上传需要的两部分

①前端程序

三要素:

  • 必须有一个类型为file的输入框
  • form表单的提交方式必须是post
  • 在form表单中,需要使enctype这个属性为multipart/form-data

②后端程序

使用spring提供的MultipartFile来接收传递过来的文件。

举例:

3、举例

编写后端接收文件的controller

然后查看后端断点的信息:

将三个文件,改名为1.txt,2.txt,3.txt,然后查看文件内容。

然后放行断点:

由上面的过程可见,后端接收前端传递的文件时,会在Tomcat服务器生成对应的临时文件,我们接下来要做的就是将这些临时文件保存下来。可以选择保存到本地,也可以选择保存到阿里云OSS服务器。

4、总结

二、本地存储

1、什么是本地存储?

在服务端(后端),接收到上传的文件后,将文件存储在本地服务器磁盘中。

2、初步代码

@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public ResultVo upload(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传:{},{},{}", username, age, image);
        //获取原始文件名(通过getOriginalFilename方法)
        String originalFilename = image.getOriginalFilename();//如:1.png   hello.txt
        //将文件存储在后端的磁盘目录中(通过transferTo方法)
        image.transferTo(new File("D:\\code\\yyzxproject\\src\\main\\resources\\static\\files\\"+originalFilename));
        return new ResultVo("200","上传成功");
    }
}

测试效果:

利用postman,向后端传入一张图片:

3、思考此时存在的问题

①不能以文件原始名称的形式存储

举例:

我们第一次上传了一个张三的自拍,照片名称为01.jpg, 第二次又上传了一个李四的自拍,照片名称也叫01.jpg。 此时李四的自拍就会覆盖张三的自拍,这就导致少了一张照片。

产生上述图片覆盖的问题,根本原因就是文件名重复了。

因此我们存储文件时,要保证文件名的唯一性。

4、使用UUID来保证文件不被覆盖(唯一性)

①什么是UUID?

UUID也称为“通用唯一识别码”,就是一个长度固定(36位)、唯一的字符串。

UUID是Java官方提供的,安装了JDK就可以使用该包。

举例:

public class Test6 {
    public static void main(String[] args) {
        String uuid = UUID.randomUUID().toString();
        System.out.println(uuid);
    }
}

运行结果:

②截取原始文件名的后缀,并拼接上UUID,构成新文件名(唯一的)

如:01.jpg的后缀是.jpg

@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public ResultVo upload(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传:{},{},{}", username, age, image);
        //获取原始文件名(通过getOriginalFilename方法)
        String originalFilename = image.getOriginalFilename();//如:1.png   hello.txt
        //构造唯一的文件名
        int index = originalFilename.lastIndexOf(".");//.出现的下标
        String extname = originalFilename.substring(index);//从.的下标,截取到最后,结果就是后缀名。如.jpg
        String newFileName = UUID.randomUUID().toString() + extname;
        //将文件存储在后端的磁盘目录中(通过transferTo方法)
        image.transferTo(new File("D:\\code\\yyzxproject\\src\\main\\resources\\static\\files\\"+newFileName));
        return new ResultVo("200","上传成功");
    }
}

也就是说,文件名是UUID,后缀还是原来的后缀。

③测试效果

5、目前仍存在的问题

①上传文件的大小有限制

我们把这个图片上传到后端,查看效果:

②问题的原因

Spring限制每次上传的单个文件大小不能超过1MB。

如果想超过,需要自己进行配置:

举例:

③配置好以后,再次上传那个2.84MB的图片,看看能否成功

6、MultipartFile的方法

7、本地存储文件的缺点

  • 前端页面无法直接访问后端的文件

        举例:

  • 服务器(后端)磁盘的容量有限,满了的时候,扩容很不方便
  • 服务器(后端)磁盘一旦损坏,存储的所有文件资源就会全部丢失

结语

以上就是本地存储文件的全部内容,但这种存储方式的确不常用,我们学习本篇文章,是为了解MultipartFile对象以及本地存储方式的缺点。

想了解阿里云存储文件,请关注本博主本专栏[JavaWeb]的下篇文章~~

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

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

相关文章

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步:市场趋势判断2.3.2 第二步:竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步:客户分析2.3.4 第四步:产品定义2.3.5 第五步:开发执…

视频播放相关的杂记

基于QT FFMPEG设计一款 RTMP协议推流、视频录制软件 实现的功能: (1)将摄像头视频流 麦克风音频流合并,并推到流媒体服务器 (2)将摄像头视频流 麦克风音频流保存到本地磁盘 基于QtFFMPEG设计一款RTM…

oracle如何创建两个数据库,以及如何用navicat连接,监听、数据泵

项目背景oracle11g, 已经非常老了, 2017年的左右;谨慎参考 W11直接搜索就行 dbca唯一需要注意的地方就是一定一定一定要以管理身份运行,否则会提示各种因为文件权限问题报的错误 然后弹出程序提示,图形化开始操作了; …

LeetCode 509.斐波那契数

动态规划思想 五步骤: 1.确定dp[i]含义 2.递推公式 3.初始化 4.遍历顺序 5.打印dp数组 利用状态压缩,简化空间复杂度。在原代码中,dp 数组保存了所有状态,但实际上斐波那契数列的计算只需要前两个状态。因此,我们…

Qml 中的那些坑(七)---ComboBox嵌入Popup时,滚动内容超过其可见区域不会关闭ComboBox弹窗

【写在前面】 最近在写信息提交 ( 表单 ) 的窗口时发现一个奇怪的 BUG: 其代码如下: import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")B…

Softing工业将在纽伦堡SPS 2024上展示Ethernet-APL现场交换机

今年,Softing工业将在纽伦堡SPS贸易展览会上展示aplSwitch Field —— 一款先进的过程自动化解决方案。这款16端口以太网高级物理层(APL)现场交换机的防护等级高达IP30,可提供从应用到现场级别的无缝以太网连接,专为Ex…

Local Transfer 致力于更加便捷地共享传输文件

软件主页:https://illusionna.github.io/LocalTransfer

分布式——BASE理论

简单来说: BASE(Basically Available、Soft state、Eventual consistency)是基于CAP理论逐步演化而来的,核心思想是即便不能达到强一致性(Strong consistency),也可以根据应用特点采用适当的方…

22.04Ubuntu---ROS2使用rclcpp编写节点C++

节点需要存在于功能包当中,功能包需要存在于工作空间当中。 所以我们要想创建节点,就要先创建一个工作空间,再创建功能包。 第一步:创建工作空间 mkdir -p chapt2_ws/src/ 第二步:创建example_cpp功能包&#xff0c…

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接

《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接 《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接基于 TCP 的半关闭单方面断开连接带来的问题套接字和流针对优雅断开的 shutdown 函数为何需要半关闭?基于半关闭…

使用 .NET Core 7 和 SignalR 构建实时聊天应用程序

动动你可爱的小手,请关注下本人公众号,继续为您提供更多原创技术文章。谢谢给为的支持 SignalR 是一个 ASP.NET 库,它支持实时 Web 功能,允许服务器立即将更新推送到客户端,从而提高应用程序的效率和响应能力。它通过简…

智慧社区可视化解决方案:科技引领社区服务与管理新篇章

随着社会的发展,智慧社区作为新型城镇化发展目标和社区服务体系建设的重要举措,正逐步改变着我们的生活方式。智慧社区通过综合运用现代科学技术,整合区域资源,提升社区治理和服务水平,为居民提供更为便捷、高效、安全…

Unicode字符集(万国码)

1.三种编码方式: UTF-16:16个bit位(2个字节)存储 UTF-32:32个bit位(4个字节)存储 UTF-8:可变长度字符编码。1-4个字节存储,只需记住:英文字母1个字节表示&…

excel功能

统计excel中每个名字出现的次数 在Excel中统计每个名字出现的次数,您可以使用COUNTIF函数或数据透视表。以下是两种方法的详细步骤: 方法一:使用COUNTIF函数 准备数据:确保您的姓名列表位于一个连续的单元格区域,例如…

A025-基于SpringBoot的售楼管理系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

nginx 部署2个相同的vue

起因: 最近遇到一个问题,在前端用nginx 部署 vue, 发现如果前端有改动,如果不适用热更新,而是直接复制项目过去,会404 因此想到用nginx 负载两套相同vue项目,然后一个个复制vue项目就可以了。…

微服务day06

MQ入门 同步处理业务: 异步处理: 将任务处理后交给MQ来进行分发处理。 MQ的相关知识 同步调用 同步调用的小结 异步调用 MQ技术选型 RabbitMQ 安装部署 其中包含几个概念: publisher:生产者,也就是发送消息的一方 …

GIT:如何查找已删除的文件的历史记录

首先你得知道文件的名称和路径 然后打开 gitlab,到项目中,仓库-> 文件 查找文件 复制文件名到可能存在过这个文件的分支当中,就能看到了

PSINS工具箱,MATLAB例程,仅以速度为观测量的SINS/GNSS组合导航(滤波方式为EKF)

基于【PSINS工具箱】,提供一个MATLAB例程,仅以速度为观测量的SINS/GNSS组合导航(滤波方式为EKF) 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码讲解:速度观测的 EKF 实现代码结构与功能EKF滤波过程结果处理…

hypermesh看模型内部

点击快捷键F5(跳跃到mask部分) 旋转即可