文件上传真hard
一、SpringMVC实现文件上传
1.1.项目结构
1.1.2 控制器方法
@RequestMapping("/upload1.do")public ModelAndView upload1(@RequestParam("file1") MultipartFile f1) throws IOException {//获取文件名称String originalFilename = f1.getOriginalFilename();String destFilePath = String.format("D:\\Study\\techCode\\SpringMVC\\mvc05-multifile\\src\\main\\webapp\\upfile\\%s", originalFilename);File destFile = new File(destFilePath);//调用transferTo将上传的文件保存到指定的地址f1.transferTo(destFile);ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName("/WEB-INF/view/result.jsp");modelAndView.addObject("msg", destFile.getAbsolutePath());return modelAndView;}
①一开始控制器方法里面的destFile 是绝对路径,可以在webapp下的upfile文件夹找到传入的文件
②我把destFile改为"src\\main\\webapp\\upfile\\%s"后,发现在upfile文件夹下找不到了,返回的msg为下面这个,他不会去找项目下的upfile文件夹,而是在tomcat安装目录下自己创建一个新的文件夹,我属实没想到
③然后我又去查阅资料,好家伙,资料没找到,又有难题来了,下面这个输出的path是什么呢,我以为是上下文路径,结果呵呵,你自己看,原来是到target目录下了,毕竟这是编译后的代码,getRealPath("/")主打的就是一个真实,按理来说这才是正确的方法
String path = request.getSession().getServletContext().getRealPath("/");
D:\Study\techCode\SpringMVC\mvc05-multifile\target\mvc05-multifile\
④我想着应该有可以访问上下文路径的方法吧,果不其然找到了
String contextPath = request.getSession().getServletContext().getContextPath();
⑤那么我们回到②中的问题,找了资料后发现没有什么有用的信息,然后我就去debug源码,看了半天,似乎是会去找路径,没找到的话就会自己在tomcat下创建,比如我改成xxx\\main\\webapp\\upfile\\%s,结果就在tomcat目录下创建了一个xxx文件夹
⑥如果我改成"\\src\\main\\webapp\\upfile\\%s",就会发现在D盘创建一个src文件夹,这里的\\应该代表的是D盘根路径,tmd真复杂
大家看除了写成绝对路径,还有没有能够获取到webapp目录的方法,请在评论区发表,万分感谢!!!
1.1.3 前端
<form method="post" action="upload1.do" enctype="multipart/form-data">文件:<input type="file" name="file1"><br/><input type="submit" value="提交">
</form>
二、SpringBoot实现文件上传
2.1 项目结构
2.2 控制器方法
@RequestMapping("/upload1.do")public String upload1(@RequestParam("file1") MultipartFile f1, HttpServletRequest request) throws IOException {String path = request.getSession().getServletContext().getRealPath("/file");System.out.println("打印path:" + path);File f = new File(path);//判断路径若不存在则创建if (!f.exists()) {f.mkdirs();}//获取当前时间用于给新文件命名Date date = new Date();//给出时间格式SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");//以此来作为新文件名的一部分String fileName = simpleDateFormat.format(date);/*获取原始文件名带扩展名*/String allName = f1.getOriginalFilename();System.out.println("原始文件名allName:" + allName);/*获取扩展名 例如.doc */String extName = allName.substring(allName.lastIndexOf("."));System.out.println("扩展名extName:" + extName);//将传过来的filef1.transferTo(new File(path + "/" + fileName + extName));return f.getAbsolutePath();}
①我就是想看看这里的路径输出和MVC有什么不同,结果又要我大跌眼镜
C:\Users\yzh\AppData\Local\Temp\tomcat-docbase.8100.6395956201871802635\file
为什么又到C盘下去了呢?
原因分析:transferTo()方法调用时,判断如果是相对路径,则使用temp目录为父目录,因此保存在tomcat的临时work目录
②接着我想着能不能像MVC那样输出到target目录下呢?->找资料->把上面的path改为下面两个之一:
String path=ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/upload";
String path = ResourceUtils.getURL("classpath:").getPath() + "static/upload";
然后你直接访问http://localhost:port/upload/xxxx.jpg就可以直接看到文件了,omg!!!
③那么我想上传到static目录下怎么办呢?也只能写绝对路径吗?请在评论区发表,万分感谢!!!
三、获取resources下文件的方法
下面这三种方法获取的路径都是
D:\Study\techCode\SpringBoot\Boot-09-UploadFile\target\classes\1.txt
3.1 使用ResourceLoader
接口
String path = resourceLoader.getResource("classpath:1.txt").getFile().getPath();
3.2 使用ClassPathResource
类
String path = new ClassPathResource("1.txt").getPath();
3.3 使用ResourceUtils.getFile()
方法
File file = ResourceUtils.getFile("classpath:1.txt");
String path = file.getPath();
String absolutePath = file.getAbsolutePath();
String canonicalPath = file.getCanonicalPath();
相关文章:

文件上传真hard
一、SpringMVC实现文件上传 1.1.项目结构 1.1.2 控制器方法 RequestMapping("/upload1.do")public ModelAndView upload1(RequestParam("file1") MultipartFile f1) throws IOException {//获取文件名称String originalFilename f1.getOriginalFilename(…...

精益管理|介绍一本专门研究防错法(Poka-Yoke)的书
在现代制造业中,如何确保产品在每个生产环节中不出现错误是企业追求的目标之一。而实现这一目标的关键技术之一就是防错法(Poka-Yoke)。作为一种简单而有效的精益管理、六西格玛管理工具,防错法帮助企业避免因人为错误或工艺不当导…...

面试题目:(4)给表达式添加运算符
目录 题目 代码 思路解析 例子 题目 题目 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)、- 或 * ,返回 所有能够得到 target 的表达式。1 < num.length &…...
[C#]将opencvsharp的Mat对象转成onnxruntime的inputtensor的3种方法
第一种方法:在创建tensor时候直接赋值改变每个tensor的值,以下是伪代码: var image new Mat(image_path);inpWidth image.Width;inpHeight image.Height;//将图片转为RGB通道Mat image_rgb new Mat();Cv2.CvtColor(image, image_rgb, Col…...

CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!
一、CTF简介 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…...

数据链路层 I(组帧、差错控制)【★★★★★】
(★★)代表非常重要的知识点,(★)代表重要的知识点。 为了把主要精力放在点对点信道的数据链路层协议上,可以采用下图(a)所示的三层模型。在这种三层模型中,不管在哪一段…...

悟空降世 撼动全球
文|琥珀食酒社 作者 | 积溪 一只猴子能值多少钱? 答案是:13个小目标 这两天 只要你家没有断网 一定会被这只猴子刷屏 它就是咱国产的3A游戏 《黑神话:悟空》 这只猴子到底有多火? 这么跟你说吧 茅台见了它都…...
Swoole 和 Java 哪个更有优势呢
Swoole 和 Java 各有优势,在性能上不能简单地说哪一个更好,需要根据具体的应用场景来分析。 Swoole 优势:高并发:Swoole 是一个基于 PHP 的异步、协程框架,专为高并发场景设计,适用于 I/O 密集型应用&…...

Salesforce 发布开源大模型 xGen-MM
xGen-MM 论文 在当今 AI 技术飞速发展的时代,一个新的多模态 AI 模型悄然崛起,引起了业界的广泛关注。这个由 Salesforce 推出的开源模型—— xGen-MM,正以其惊人的全能特性和独特优势,在 AI 领域掀起一阵旋风。那么,x…...

冒 泡 排 序
今天咱们单独拎出一小节来聊一聊冒泡排序昂 冒泡排序的核心思想就是:两两相邻的元素进行比较(理解思路诸君可看下图) 接下来我们上代码演示: 以上就是我们初步完成的冒泡排序,大家不难发现,不管数组中的元…...

采用先进的人工智能视觉分析技术,能够精确识别和分析,提供科学、精准的数据支持的智慧物流开源了。
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...
IAA游戏APP如何让合理地让用户观看更多广告,提高广告渗透率
广告变现已经成为休闲游戏开发者重要的收益方式之一,超50%国内休闲游戏已经采用广告变现的方式,游戏广告预算是游戏行业开发者广告变现的主要预算来源。 #深度好文计划#如何合理地提高广告渗透率? 广告渗透率能直接反映游戏中有广告行为用户…...

环网交换机的特殊作用是什么?
环网交换机作为现代网络建设的重要组成部分,具有独特而特殊的作用。在信息技术迅猛发展的今天,各类数据传输和网络连接需求日益增加,环网交换机的出现为解决这些问题提供了理想的方案。环网交换机通常将多个网络节点通过环形结构连接起来&…...
mac电脑安装Zsh并启用
安装 Zsh 1. 安装 Zsh 新版mac系统会默认安装并使用zsh,如没用,需在终端中安装: brew install zsh2. 安装 Oh My Zsh 克隆Oh My Zsh到你的目录: git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh3. 复…...

【后续更新】python搜集上海二手房数据
源码如下: import asyncio import aiohttp from lxml import etree import logging import datetime import openpyxlwb = openpyxl.Workbook() sheet = wb.active sheet.append([房源, 房子信息, 所在区域, 单价, 关注人数和发布时间, 标签]) logging.basicConfig(level=log…...

创建GPTs,打造你的专属AI聊天机器人
在2023年11月的「OpenAI Devday」大会上,OpenAI再度带来了一系列令人瞩目的新功能,其中ChatGPT方面的突破尤为引人关注。而GPTs的亮相,不仅标志着个性化AI时代的到来,更为开发者和普通用户提供了前所未有的便利。接下来࿰…...
深度学习 vector 之模拟实现 vector (C++)
1. 基础框架 这里我们有三个私有变量,使用 _finish - _start 代表 _size,_end_of_storage - _start 代表 _capacity,并且使用到了模版,可以灵活定义存储不同类型的 vector,这里将代码量较小的函数直接定义在类的内部使…...

关于LLC知识10
在LLC谐振腔中能够变化的量 1、输入电压 2、Rac(负载) 所以增益曲线为红色(Rac无穷大)已经是工作的最大极限了,LLC不可能工作在红色曲线之外 负载越重时,增益曲线越往里面 假设: 输入电压…...
最长的严格递增或递减子数组
给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 示例 1: 输入:nums [1,4,3,3,2] 输出:2 解释: nums 中严格递增的子数组有[1]、[2]、[3]、[3]、[4] 以及 [1,4] 。 nums 中…...

【JavaEE】SpringBoot 统一功能处理:拦截器、统一数据返回与异常处理的综合应用与源码解析
目录 SpringBoot 统⼀功能处理拦截器拦截器快速⼊⻔拦截器详解拦截路径拦截器执⾏流程 登录校验定义拦截器注册配置拦截器 DispatcherServlet 源码分析(了解)初始化(了解) DispatcherServlet的初始化1. HttpServletBean.init()2. FrameworkServlet.initServletBean() WebApplic…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...