当前位置: 首页 > news >正文

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);//从.的下标,截取到最后,结果就是后缀名。如.jpgString 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]的下篇文章~~

相关文章:

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...

C++ 中的异常处理机制是怎样的?

异常处理的基本概念: 异常: 程序在运行时发生的错误或意外情况。 抛出异常: 使用 throw 关键字将异常传递给调用堆栈。 捕获异常: 使用 try-catch 块捕获和处理异常。 异常类型: 表示异常类别的标识符。 异常处理流程: 抛出异常: 当检测到错误或意…...

SwiftUI-基础入门

开发OS X 图形应用界面时有三种实现方式:XIB、Storyboard、SwiftUI。Storyboard基于XIB做了优化,但XIB基本被放弃了,而SwiftUI是苹果公司后来开发的一套编程语言,用来平替Objective-C。虽然现在Swift 6 还是有些不完善的地方&…...

C++builder中的人工智能(20):如何在C++中开发一个简单的Hopfield网络

在AI技术的发展历史中,模式识别模型是最伟大的AI技术之一,尤其是从像素图像中读取文本。其中一个是Hopfield网络(或称为Ising模型的神经网络或Ising–Lenz–Little模型),这是一种递归神经网络形式,由John J…...

video2gif容器构建指南

一、介绍 1.项目概述 Video2Gif 项目旨在提供一种便捷的方式,让用户能够将视频中的精彩片段快速转换为 GIF 动画。GIF 动画因其循环播放、文件体积小等特点,在社交媒体、聊天工具中广泛应用,用于表达情感、分享趣事等。 2.核心功能 视频导…...

探秘Spring Boot中的@Conditional注解

文章目录 1. 什么是Conditional注解?2. 为什么需要Conditional注解?3. 如何使用Conditional注解?4. Conditional注解的高级用法5. 注意事项6. 结语推荐阅读文章 在Spring Boot的世界里,配置的灵活性和多样性是至关重要的。有时候&…...

树形dp总结

这类题型在 dp 中很常见,于是做一个总结吧!!! 最经典的题:没有上司的舞会 传送门:没有上司的舞会 - 洛谷 状态表示: dp[i][0] 为 以 i 为根的子树中,选择 i 节点的最大欢乐值 d…...

【算法一周目】双指针(2)

目录 有效三角形的个数 解题思路 C代码实现 和为s的两个数字 解题思路 C代码实现 三数之和 解题思路 C代码实现 四数之和 解题思路 C代码实现 有效三角形的个数 题目链接:611. 有效三角形的个数题目描述:给定一个包含非负整数的数组nums&…...

vue内置方法总结

目录 1. 生命周期钩子方法 2. 响应式系统方法 3. DOM 更新方法 4. 事件处理方法 5. 访问子组件和 DOM 元素 6. 数据观察方法 7. 其他方法 1. 生命周期钩子方法 这些方法在 Vue 实例的不同生命周期阶段自动调用。 beforeCreate: 在实例初始化之后&#xff0c…...

面向对象分析与设计

前言: 感觉书本上和线上课程, 讲的太抽象, 不好理解, 但软件开发不就是为了开发应用程序吗?! 干嘛搞这么抽象,对吧, 下面是个人对于软件开发的看法, 结合我的一些看法, 主打简单易懂, 当然,我一IT界小菜鸟, 对软件开发的认识也很浅显, 这个思维导图也仅仅是现阶段我的看…...

lineageos-19 仓库群遍历,打印第一条git log

lineageos-19 仓库群遍历,打印第一条git log RepoLsRootD/app4/lineage19_oneplus6 LogF/app4/wiki/repo_head_log_ls-lineageos19.1.log rm -v $LogF && \ cd $RepoLsRootD && \ find . -type l -path "*/*.git" -not -path "./.repo/*"…...

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中,SendMessage方法是一个强大的工具,它允许我们与Windows API交互,模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数,它用…...

VMware安装黑苹果后ICLOUD_UNSUPPORTED_DEVICE(不支持的Icloud设备)

修改文件 关闭虚拟机找到虚拟机文件中以.vmx结尾的文件编辑内容(补充缺失) board-id "Mac-551B86E5744E2388" hw.model.reflectHost "FALSE" hw.model "MacBookPro14,3" serialNumber.reflectHost "FALSE"…...

Python | Leetcode Python题解之第542题01矩阵

题目: 题解: class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组,所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…...

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…...

【LeetCode】【算法】55. 跳跃游戏

LeetCode 99 - 55. 跳跃游戏 题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回 …...

华为:hcia综合实验

一、拓扑图 二、实验要求 1. pc地址请自行规划,vlan已给出 2. 服务器地址自行规划,vlan,网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机,交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…...

MyBatis与MyBatis-Plus(基础)

MyBatis-Plus的优势 在 Spring Data JPA 已经很方便的情况下,有时仍然选择使用 MyBatis-Plus 的核心原因主要有以下三点: 1. 复杂 SQL 控制能力更强 MyBatis-Plus 允许直接编写和优化 SQL,适合复杂查询、精细化 SQL 控制的场景。特别是在性…...

一文总结java语法规则

1. 题记 Java是一门拥有较强语法规则的编程语言,本博文主要总结介绍java语言的java语法规则。 2. java语法规则 2.1 标识符(Identifiers) 定义:标识符是用来给变量、类、方法、接口等命名的字符序列。规则: –标识…...

使用 npm 安装 Yarn

PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...