当前位置: 首页 > 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、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后…...

【独家首发】ElevenLabs未公开的缅甸文字母映射表+音节切分规则(含Unicode 15.1适配清单)

更多请点击: https://codechina.net 第一章:ElevenLabs缅甸文语音支持的底层架构概览 ElevenLabs 对缅甸文(Burmese, my-MM)的语音合成支持并非简单添加语言标签,而是依托其端到端神经语音建模栈完成深度适配。其核心…...

TVA:打通数字AI到物理AI的关键桥梁(系列)

重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

Spring AI生产环境 Checklist:20条黄金法则

前言 本文总结Spring AI生产环境部署的最佳实践,涵盖配置、安全、监控、性能四大维度,每条都是实战经验。 一、配置管理(5条) 1. API Key必须通过环境变量注入 # ✅ 推荐 spring:ai:openai:api-key: ${OPENAI_API_KEY}# ❌ 禁…...

IDM激活脚本:破解30天限制背后的注册表权限技术内幕

IDM激活脚本:破解30天限制背后的注册表权限技术内幕 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 你是否曾经因为IDM的30天试用期到期而烦恼&#…...

Delft3D建模、水动力模拟方法及在地表水环境影响评价中的实践技术应用

一:Delft3D软件介绍及建模原理和步骤对常见的地表水数值模型进行介绍,学习Delft3D软件的构成、界面内容,了解地表水数值模型的建模步骤:1.1地表水数值模拟常用软件介绍EFDC_Explorer(商业) Delft3D&#xf…...

避坑指南:华为云Stack OBS 3.0对象存储部署,小型化与标准化方案到底怎么选?

华为云Stack OBS 3.0部署选型实战:小型化与标准化方案深度对比 当企业级用户面对华为云Stack OBS 3.0对象存储部署时,第一个关键决策点往往出现在架构形态的选择上——是采用轻量灵活的小型化方案,还是选择高扩展性的标准化部署?这…...

Python之rf-phate包语法、参数和实际应用案例

一、RF‑PHATE 包核心功能 RF‑PHATE 是一个有监督降维与可视化包,核心是把随机森林(RF)特征重要性与 PHATE(基于热扩散的流形嵌入) 结合,生成标签导向的低维嵌入,凸显与响应变量相关的结构、抑…...

如何高效配置跨架构模拟器:Box64专业用户的终极实践指南

如何高效配置跨架构模拟器:Box64专业用户的终极实践指南 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 Box64是…...

深入解析Ollama-for-amd:AMD GPU本地大模型部署实战指南

深入解析Ollama-for-amd:AMD GPU本地大模型部署实战指南 【免费下载链接】ollama-for-amd Get up and running with Llama 3, Mistral, Gemma, and other large language models.by adding more amd gpu support. 项目地址: https://gitcode.com/gh_mirrors/ol/ol…...

架构解密:如何通过FastExcel流式处理引擎重塑Java Excel操作效率标准

架构解密:如何通过FastExcel流式处理引擎重塑Java Excel操作效率标准 【免费下载链接】fastexcel Generate and read big Excel files quickly 项目地址: https://gitcode.com/gh_mirrors/fas/fastexcel 在当今数据驱动的企业环境中,Excel文件处理…...