文件上传真hard

news2024/11/27 14:45:07

一、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);
        //将传过来的file
        f1.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();

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库之Mybatis映射文件、动态SQL

目录 1.XML映射文件 2.动态SQL 1.XML映射文件 之前我们执行sql语句是通过注解的方式&#xff0c;还有另外一种方式是通过XML配置文件执行sql语句&#xff0c;这份文件在Mybatis中也称为XML映射文件。 XML配置文件的规范&#xff1a;只有这三条规范都正确的情况下&#xff0…

基于SSM的二手车交易管理系统的设计与实现 (含源码+sql+视频导入教程+论文)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手车交易管理系统拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;二手车信息管理、类型管理、定金支付管理、预约到店管理、二手车评估管理、论坛管理、系统管理、…

数据库Mybatis基础操作

目录 基础操作 删除 预编译SQL 增、改、查 自动封装 基础操作 环境准备 删除 根据主键动态删除数据&#xff1a;使用了mybatis中的参数占位符#{ }&#xff0c;里面是传进去的参数。 单元测试&#xff1a; 另外&#xff0c;这个方法是有返回值的&#xff0c;返回这次操作…

stack/queue容器

stack容器 std::stack 是 C 标准库中定义的容器适配器&#xff08;container adaptor&#xff09;&#xff0c;它基于其他底层容器&#xff08;如 std::deque、std::list 或 std::vector&#xff09;实现了后进先出&#xff08;LIFO&#xff09;的数据结构。栈容器没有迭代器&…

JavaScript_10_练习:轮播图

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>练习&#xff1a;轮播图</title>…

OD C卷 - 查找一个有向网络的头节点和尾节点

查找一个有向网络的头节点和尾节点 &#xff08;200&#xff09; 在一个有向图中&#xff0c;有向边用两个整数表示&#xff0c;第一个整数表示起始节点&#xff0c;第二个整数表示终止节点&#xff1b;图中只有一个头节点&#xff0c;一个或者多个尾节点&#xff1b;图可能存…

Linux系统信息排查

目录 介绍步骤 介绍 1、熟悉查看CPU信息、操作系统信息、用户信息、特殊权限账户、启动项和任务计划的排查命令 2、在进行受害主机排查时&#xff0c;首先要对主机系统进行基本排查&#xff0c;方便对受害主机有一个初步的了解。 3、利用lscpu和uname -a查看系统硬件软件基本…

JavaScript(28)——正则表达式

定义正则表达式语法&#xff1a; const 变量名 /表达式/ 判断是否有符合规则的字符串&#xff1a; test()方法 用来查看正则表达式与指定的字符串是否匹配 语法&#xff1a; regObj.test(被检测的字符串) //返回布尔值 regObj.exec(字符串) //返回的是数组 <script>…

基于Docker compose部署Confluence 8.3.4及设置数据持久化存储的总结

基于Docker compose部署Confluence 8.3.4及设置数据持久化存储的总结 一、环境信息二、安装部署三、向导 介绍如何基于Docker、Docker Compose的方式安装部署Confluence 8.3.4&#xff0c;并且设置数据的持久化存储。 一、环境信息 操作系统&#xff1a;CentOS 7.9 Docker Ver…

C++之多态(下)

目录 多态的实现原理 多态的拓展 单继承中的多态 多继承中的多态 上期&#xff0c;我们学习了多态的基本概念&#xff0c;本期我们来学习多态的实现原理。 多态的实现原理 class Base { public:virtual void func1(){cout << "Base::func1()" <<…

CUTLASS 中的 47_ampere_gemm_universal_streamk 示例

前一篇文章介绍了 Stream-K: Work-centric Parallel Decomposition for Dense Matrix-Matrix Multiplication on the GPU 论文&#xff0c;下面对其代码实现进行分析。 cutlass 的 examples/47_ampere_gemm_universal_streamk 展示了 GEMM Stream-K 算法在 Ampere 架构上的使用…

健身房管理系统--论文pf

TOC springboot542健身房管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…

思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”

01      思特科技为“国家宝藏数字体验展”提供“数字技术”支持&#xff0c;带来国宝的数字化演绎。以《国家宝藏》顶级IP为基础&#xff0c;打造的全新沉浸文化项目“国宝数字体验展“&#xff0c;借由文物的视角、站在历史的星河中&#xff0c;探寻时间长河中不变的智慧…

设计模式笔记02(java版)

文章目录 创建者模式单例设计模式 ★单例模式的结构单例模式的实现饿汉式-方式1&#xff08;静态变量方式&#xff09;饿汉式-方式2&#xff08;静态代码块方式&#xff09;懒汉式-方式1&#xff08;线程不安全&#xff09;懒汉式-方式2&#xff08;线程安全&#xff09;懒汉式…

Linux环境安装 JDK

目录 JDK准备 1&#xff09;卸载现有JDK&#xff08;3台节点&#xff09; 2&#xff09;用Xftp工具将JDK导入到hadoop12的/opt/software文件夹下面 3&#xff09;在Linux系统下的opt目录中查看软件包是否导入成功 4&#xff09;解压JDK到/opt/module目录下 5&#xff09;配…

数据恢复新宠儿:2024年新兴软件趋势与亮点解析

你的手机、优盘、电脑里是不是都存储这你生活的点点滴滴&#xff1f;不知道你有没有遇到过数据误删或者消失的情况。如果有数据恢复精灵能帮你找回数据是不是为你的数据找回点亮了方向。这次我就介绍几款数据恢复工具带你走出数据丢失的困境。 1.福昕数据恢复 链接直达&#…

告别 Coding 噩梦-掌握这10个习惯,成为大数据开发高手

你是否曾在半夜被一个顽固的bug折磨得睡不着觉?是否因为理解不了复杂算法而感到沮丧?别担心,你并不孤单。作为一名经验丰富的大数据开发者,我深知编程之路上的挫折感。但今天,我要和你分享我是如何在这条充满荆棘的道路上找到突破,最终成长为一名得心应手的编程高手的。 前…

达梦数据库的系统视图v$tablespace

达梦数据库的系统视图v$tablespace 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$TABLESPACE 提供了有关数据库中的表空间&#xff08;Tablespace&#xff09;信息。这些信息对于管理数据库存储和优化性能非常关键。表空间是数据库逻辑存储结构的一个层次…

基于Java的小区物业管理系统设计与实现

TOC springboot596基于Java的小区物业管理系统设计与实现--论文 研究背景 小区物业管理系统主要通过计算机网络&#xff0c;对小区物业管理系统所需的信息进行统一管理&#xff0c;方便用户随时随地进行增添、修改、查询、删除各类信息。本系统极大的促进了系统与数据库管理…

Python编码系列—前端后浪:Python前后端分离开发实战指南

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…