文件上传真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();
相关文章:
![](https://i-blog.csdnimg.cn/direct/baf6a038b50743d58b9b853d35fb39d5.png)
文件上传真hard
一、SpringMVC实现文件上传 1.1.项目结构 1.1.2 控制器方法 RequestMapping("/upload1.do")public ModelAndView upload1(RequestParam("file1") MultipartFile f1) throws IOException {//获取文件名称String originalFilename f1.getOriginalFilename(…...
![](https://img-blog.csdnimg.cn/img_convert/87d072cb0f1d4948eebc4a6f883a9e9f.webp?x-oss-process=image/format,png)
精益管理|介绍一本专门研究防错法(Poka-Yoke)的书
在现代制造业中,如何确保产品在每个生产环节中不出现错误是企业追求的目标之一。而实现这一目标的关键技术之一就是防错法(Poka-Yoke)。作为一种简单而有效的精益管理、六西格玛管理工具,防错法帮助企业避免因人为错误或工艺不当导…...
![](https://i-blog.csdnimg.cn/direct/475753d2404f4a7ebe2c710f6077578c.png)
面试题目:(4)给表达式添加运算符
目录 题目 代码 思路解析 例子 题目 题目 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)、- 或 * ,返回 所有能够得到 target 的表达式。1 < num.length &…...
![](https://www.ngui.cc/images/no-images.jpg)
[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…...
![](https://i-blog.csdnimg.cn/direct/4691c8500e89454c80e1a7c38104dc24.png)
CTF入门教程(非常详细)从零基础入门到竞赛,看这一篇就够了!
一、CTF简介 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…...
![](https://i-blog.csdnimg.cn/direct/b326dd9ce52d4c619c5a4d68601d9aec.png)
数据链路层 I(组帧、差错控制)【★★★★★】
(★★)代表非常重要的知识点,(★)代表重要的知识点。 为了把主要精力放在点对点信道的数据链路层协议上,可以采用下图(a)所示的三层模型。在这种三层模型中,不管在哪一段…...
![](https://img-blog.csdnimg.cn/img_convert/5f79574c5acf639596609bebfd9a9690.png)
悟空降世 撼动全球
文|琥珀食酒社 作者 | 积溪 一只猴子能值多少钱? 答案是:13个小目标 这两天 只要你家没有断网 一定会被这只猴子刷屏 它就是咱国产的3A游戏 《黑神话:悟空》 这只猴子到底有多火? 这么跟你说吧 茅台见了它都…...
![](https://www.ngui.cc/images/no-images.jpg)
Swoole 和 Java 哪个更有优势呢
Swoole 和 Java 各有优势,在性能上不能简单地说哪一个更好,需要根据具体的应用场景来分析。 Swoole 优势:高并发:Swoole 是一个基于 PHP 的异步、协程框架,专为高并发场景设计,适用于 I/O 密集型应用&…...
![](https://img-blog.csdnimg.cn/img_convert/5b0541a0a8fedf23700c35d8be642e53.jpeg)
Salesforce 发布开源大模型 xGen-MM
xGen-MM 论文 在当今 AI 技术飞速发展的时代,一个新的多模态 AI 模型悄然崛起,引起了业界的广泛关注。这个由 Salesforce 推出的开源模型—— xGen-MM,正以其惊人的全能特性和独特优势,在 AI 领域掀起一阵旋风。那么,x…...
![](https://i-blog.csdnimg.cn/direct/1bbea44c4209425ab0a6319d6740c70e.png)
冒 泡 排 序
今天咱们单独拎出一小节来聊一聊冒泡排序昂 冒泡排序的核心思想就是:两两相邻的元素进行比较(理解思路诸君可看下图) 接下来我们上代码演示: 以上就是我们初步完成的冒泡排序,大家不难发现,不管数组中的元…...
![](https://img-blog.csdnimg.cn/direct/0eed9aa32af4480691ccf310f5a6aa0a.png)
采用先进的人工智能视觉分析技术,能够精确识别和分析,提供科学、精准的数据支持的智慧物流开源了。
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...
![](https://www.ngui.cc/images/no-images.jpg)
IAA游戏APP如何让合理地让用户观看更多广告,提高广告渗透率
广告变现已经成为休闲游戏开发者重要的收益方式之一,超50%国内休闲游戏已经采用广告变现的方式,游戏广告预算是游戏行业开发者广告变现的主要预算来源。 #深度好文计划#如何合理地提高广告渗透率? 广告渗透率能直接反映游戏中有广告行为用户…...
![](https://i-blog.csdnimg.cn/direct/9cb65d488f79436688b896e04f154fce.png)
环网交换机的特殊作用是什么?
环网交换机作为现代网络建设的重要组成部分,具有独特而特殊的作用。在信息技术迅猛发展的今天,各类数据传输和网络连接需求日益增加,环网交换机的出现为解决这些问题提供了理想的方案。环网交换机通常将多个网络节点通过环形结构连接起来&…...
![](https://www.ngui.cc/images/no-images.jpg)
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. 复…...
![](https://i-blog.csdnimg.cn/direct/9e718e3c03984b98b275facd488ae863.png)
【后续更新】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…...
![](https://img-blog.csdnimg.cn/img_convert/951becdba2d01ed558aa86ab8985a5f3.png)
创建GPTs,打造你的专属AI聊天机器人
在2023年11月的「OpenAI Devday」大会上,OpenAI再度带来了一系列令人瞩目的新功能,其中ChatGPT方面的突破尤为引人关注。而GPTs的亮相,不仅标志着个性化AI时代的到来,更为开发者和普通用户提供了前所未有的便利。接下来࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
深度学习 vector 之模拟实现 vector (C++)
1. 基础框架 这里我们有三个私有变量,使用 _finish - _start 代表 _size,_end_of_storage - _start 代表 _capacity,并且使用到了模版,可以灵活定义存储不同类型的 vector,这里将代码量较小的函数直接定义在类的内部使…...
![](https://i-blog.csdnimg.cn/direct/dd6fab798fc6412ebe3ce01d2368919e.jpeg)
关于LLC知识10
在LLC谐振腔中能够变化的量 1、输入电压 2、Rac(负载) 所以增益曲线为红色(Rac无穷大)已经是工作的最大极限了,LLC不可能工作在红色曲线之外 负载越重时,增益曲线越往里面 假设: 输入电压…...
![](https://www.ngui.cc/images/no-images.jpg)
最长的严格递增或递减子数组
给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 示例 1: 输入:nums [1,4,3,3,2] 输出:2 解释: nums 中严格递增的子数组有[1]、[2]、[3]、[3]、[4] 以及 [1,4] 。 nums 中…...
![](https://i-blog.csdnimg.cn/direct/cbde6adfb3c9444bb1775c8bf97d3002.png)
【JavaEE】SpringBoot 统一功能处理:拦截器、统一数据返回与异常处理的综合应用与源码解析
目录 SpringBoot 统⼀功能处理拦截器拦截器快速⼊⻔拦截器详解拦截路径拦截器执⾏流程 登录校验定义拦截器注册配置拦截器 DispatcherServlet 源码分析(了解)初始化(了解) DispatcherServlet的初始化1. HttpServletBean.init()2. FrameworkServlet.initServletBean() WebApplic…...
![](https://i-blog.csdnimg.cn/direct/30881294c2674aa181501c377b02bdb4.jpeg)
I2C学习:上拉电阻选取
一.I2C简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。I2C总线在使用时,需要接上拉电阻,这是因为I2C接口是开漏输出,如图1所示。 图1 I2C开漏输出 I2C有5种速度模式:标准(100KHz&am…...
![](https://i-blog.csdnimg.cn/direct/0996022bd3ec4f86ba2b3ff5be6d16f9.png)
AC自动机-1
AC自动机(Aho-Corasick Automaton)是一种高效的多模式字符串匹配算法。它是由Alfred Aho和Margaret Corasick在1975年提出的。这种算法可以在一次扫描输入文本的情况下,同时查找多个模式串。 基本概念 Trie树 AC自动机是基于字典树数据结构构建的字典树…...
![](https://www.ngui.cc/images/no-images.jpg)
注解@Service@Component@Slf4j@Data
在Java中,这四个注解分别属于不同的用途和库,下面是它们各自的作用: Service: 这个注解通常用于Spring框架中,它用于标记服务层组件。在Spring中,服务层通常包含业务逻辑。当一个类被标记为Service…...
![](https://www.ngui.cc/images/no-images.jpg)
【Nodejs】六、express框架
目录 一、express 介绍 二、express 使用 2.1 express 下载 2.2 express 使用 三、express 路由 3.1 什么是路由 3.2 路由的使用 3.3 获取请求参数 3.4 获取路由参数 四、express 响应设置 五、express 中间件 5.1 什么是中间件 5.2 中间件的作用 5.3 中间件的类…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
进阶 pro max
最近搞了许多有趣的东西,比如自制rtos,速成数模电,学了一点点的AD,看着视频弄了HAL库,以及定时器和串口中断配合实现接收任意长度(不超过缓冲值)数据,还有配置hal库的freertosfafts …...
![](https://img-blog.csdnimg.cn/img_convert/3f0505de6d47ec0589dd3c1c661ddb9b.gif)
Agentic Security:一款针对LLM模型的模糊测试与安全检测工具
关于Agentic Security Agentic Security是一款针对LLM模型的模糊测试与安全检测工具,该工具可以帮助广大研究人员针对任意LLM执行全面的安全分析与测试。 请注意 Agentic Security 是作为安全扫描工具设计的,而不是万无一失的解决方案。它无法保证完全防…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Cloud Config 与 Spring Cloud Bus 来实现动态配置文件
要使用 Spring Cloud Config 与 Spring Cloud Bus 来实现动态配置文件,你可以按照以下步骤操作: ### 步骤 1: 添加依赖 首先,确保你的项目中添加了 Spring Cloud Config 客户端和 Bus 的依赖。对于 Maven 项目,pom.xml 文件应该…...
![](https://www.ngui.cc/images/no-images.jpg)
Qt:Qt背景
目录 1.Qt解释 2.Windows下开发GUI的方案 3.框架 4.Qt历史 4.Qt支持的平台 5.Qt版本 6.Qt案例 1.Qt解释 前端开发,分为网页前端开发(Web)、桌面应用开发(Windows、Linux)、移动应用开发(Android)。Q…...
![](https://i-blog.csdnimg.cn/direct/4d91bacba58c44b28e5a760efd9edb1b.png)
【数据结构】选择排序
🍬个人主页:Yanni.— 🌈数据结构:Data Structure. 🎂C语言笔记:C Language Notes 🏀OJ题分享: Topic Sharing 目录 前言: 基本思想 直接选择排序 思路分…...
![](https://i-blog.csdnimg.cn/direct/0435f2ba201242519650d078b8f3d4fa.png)
国产GD32单片机开发入门(二)GD32单片机详解
文章目录 一.概要二.单片机型号命名规则三.GD32F103系统架构四.GD32F103C8T6单片机启动流程五.GD32F103C8T6单片机主要外设资源六.单片机开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.GD32单片机内部框图3.GD32单片机管脚图4.GD32单片机每个管脚功能5.单片机功耗数…...
![](/images/no-images.jpg)
平面设计网站推荐/拓客软件排行榜
Python初学者的自我修养,找到自己的方向 对于我来说Python的应用场景主要是机器学习、深度学习相关,对于其他的场景涉猎不多。因此本文的目的并不是列举出一系列小项目给你们练手,而是希望引导大家思考这个问题,从而找到适合自己…...
![](/images/no-images.jpg)
用wgert 做网站/搜狗收录提交
jQuery Mobile 是针对触屏智能手机与平板电脑的网页开发框架。 移动端兼容性好,但是pc端兼容较差。 <head> <!-- meta使用viewport以确保页面可自由缩放 --> <meta name"viewport" content"widthdevice-width, initial-scale1&quo…...
![](/images/no-images.jpg)
日本程序员自己做相亲网站/优化软件seo排名
原文出处:http://www.oschina.net/question/12_23148 感谢原作者分享。我也是搞了好久没有头绪,突然搜到这篇帖子。忽然开朗。下面是教程: 本教程使用 JDK 6 和 Tomcat 7,其他版本类似。 实验环境: windows xp 32bit E…...
设计做网站/展示型网站有哪些
如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 下载了网易公开课的视频之后,发现它的中文和英文字母是分开的,用其他播放器打开的时候只能载入一个字幕,于是就想合并2个文件 思路…...
![](/images/no-images.jpg)
it运维外包服务方案/seo网站排名优化快速排
一、接口测试的本质 :只是做了数据传递 二、接口测试的核心含义 :能够把请求发出去,然后接收的响应结果,结束是否达到我们的预期 三、Jmeter进行接口测试的固定流程 1.用工具创建HTTP请求 2.用工具发出请求 3.校验数据ÿ…...
![](https://img-blog.csdnimg.cn/img_convert/e1e4d7c3ecccbbb450f347c1bf2b16ba.png)
海南网站建设哪里好/谷歌搜索引擎363
一、ResNet模型接上一篇文章的内容,下面这种CNN模型就更加经典,并且也是目前运用最为广泛的模型了。在2015年,何凯明提出了152层的ResNet,以3.6%的误差摘得了2015年ILSVRC比赛的桂冠,同时ResNet的提出解决了神经网络中因为网络深度…...