文件对象MultipartFile和文件对象File的使用方法

2023-11-15

1,前端上传的文件对象file

public String upload(MultipartFile file) throws IOException {     

    String originalFilename = file.getOriginalFilename();    //获取文件原始名称,比如上传文件名为aa.txt

    long size=file.getSize()/1024;          //获取文件大小,单位kb

    file.getContentType();       //获取文件类型,比如图片就是imag/jpe

  try{
     file.transferTo(new  File(System.getProperty("user.dir")+"/AA/BB/aa.txt") )      //可以传入java自动的文件对象 //这个表示将file中的数据写入到BB目录中的aa.txt文件中, BB目录必须是已存在的,这样就表示将file中的数据写入并生成了aa.txt文件
 }catch(IOException  e){
     System.out.println("路径为找到")
      }          //这个是上传文件的时候最容器包的错



transferTo在英文中表示"转移到", 其实就相当于将当前文件对象中的数据转移到磁盘对象中去
 

 发现一个错误:

当在transferTo的文件对象中使用相对路径的时候,

transferTo的内部会自动在这个相对路径前面添加一个临时文件路径:C:\Users\zzzzz\AppData\Local\Temp\tomcat.8888.3312050621851573603\work\Tomcat\localhost\ROOT

-

-

-

所以你一定要使用绝对路径,或者也可以使用System.getProperty("user.dir")来获取当前的工作路径,  transferTo()内部是无法识别"./"和"/"的,当transferTo()发现你的file对象是一个相对路径的时候,就会自动给你添加一个临时路径拼接上去,但是transferTo()是可以识别System.getProperty()的

比如: file.transferTo(new  File("./AA/BB") )是错误的

         file.transferTo(new File("/AA/BB") )也是错误的

-

-

-

其核心根本原因是:

   1) new  File("./AA/BB").mkdirs()             //他会在当前工作目录中生成AA/BB目录

       而使用:file.TransferTo(new  File("./AA/BB") )它所找到的目录是" 临时目录/./AA/BB",自然就报错了

-

-

-

   2)  new  File("/AA/BB").mkdirs()           //它会在当前根目录下生成AA/BB目录

    而使用:file.TransferTo(new  File("/AA/BB") )它所找的目录是" 临时目录/AA/BB"

 这个自然也会报错

-

-

-

3)  new   File(System.getProperty("user.dir")+"/AA/BB").mkdirs()     //这个是正确的,

        file.transferTo( new   File(System.getProperty("user.dir")+"/AA/BB") )能过识别到System.getProperty()为当前的工作目录, 最终组成了一个绝对路径

-

-

-

-

-

如果说我非要使用相对路径呢:

一般transferTo()有两种使用方法:

 a) transferTo(new  File(“/AA/BB") );            //传入File对象的时候,如果使用的是相对路径,就会自动拼接上一个临时路径,从而就会如上所示报错

-

-

b) transferTo(Paths.get("/AA/BB") )      //这个Path对象可以识别到"./"和”/",所以不会报错,

                        //它就完美的解决了方法(a)所存在的问题了

注意:file是指文件上传对象

我在打包成docker镜像之后,运行的时候,transferTo()所添加的临时路径就是当前容器的根目录

比如:在镜像容器中运行:

        new   File("/AA/BB")                  //就是在当前容器的根目录中生成/AA/BB目录

       file.transferTo(new  File("/AA/BB") )    //它所添加的临时路径就是容器的根目录,所以不会报错

2,java自带的文件对象file

File  file=new File("/AA/BB")           //这里的路径是"/AA/BB"

file.mkdirs();            //生成多级目录

file.mkdir();            //只会生成最后一级目录,如果上一级不存在则不生成

发现一个奇怪现象:

当前项目运行在D盘中的D:/桌面/SpringBoot2022

  file对象路径为: "/AA/BB"

   生成的具体位置: D:/AA/BB

 路径为:"./AA/BB"

  生成的具体位置: D:/桌面/SpringBoot2022/AA/BB, 也就是和项目的src目录是在同一级

-

感觉就是打点".", 则会将当前项目的路径自动拼接上去,也就是项目的工作目录拼接上去了

其实还有一个高级用法: System.getProperty("user.dir"),  这个也是自动获取项目的工作目录,结果为D:/桌面/SpringBoot2022, 但是还是感觉直接在创建的时候打点"."比较方便

没有打点".",  则会直接向项目所在的根目录"D:"给拼接上去

-

-

-

在后面我将java项目打包成jar包后,又会产生的现象:

  路径为: "./AA/BB"

 将jar包放在路径为D:/桌面/SS中的SS文件夹中,

结果生成的文件夹的具体位置: D:/桌面/SS/AA/BB,  它并不会将文件夹生成到项目的内部,而是会将目录生成到jar包所在的目录中

-

-

-

-

 路径为:"AA/BB"

 将jar包还是放在路径为D:/桌面/SS中的SS文件夹中,

 生成的文件夹的路径为: D:/AA/BB,

如果将jar包放在A:/桌面/SS中,生成文件夹的路径就是: A:/AA/BB

-

-

-

-

-

-

总结: 以"/"开头的相对路径, 会直接将程序目录所在的根路径自动拼接上

         以"./"开头的相对路径,则会将程序的工作目录自动拼接上,

           其中:jar包运行的目录就是工作目录,在没有打包时,springboot的工作目录需要自己进行区分

3, 工作目录的含义

所谓的工作目录就是创建Maven项目的最外层的那个目录,怎么说呢

比如:创建了一个SpringBoot项目,路径为: D:/桌面/SpringBoot

那么这个D:/桌面/SpringBoot就是当前项目的工作目录

-

-

-

再比如:  你随便创建一个文件夹AA, 路径为: D:/桌面/AA

然后通过idea打开这个文件夹AA

然后在文件夹AA中新建文件夹BB

然后在文件夹BB中新建一个模块,在这个模块中编写SpringBoot项目,该模块名称为music

此时在SpringBoot项目中的java代码中创建目录: new  File("./zz").mkdirs()

那么这个zz目录会生成在哪呢,

首先你要知道"./"表示工作目录, 而该SpringBoot的工作目录就是D:/桌面/AA

所以最终生成的zz目录路径就是"D:/桌面/AA/zz"

如下图所示,虽然该springboot项目是在musice-server目录中,

但是它的工作目录还是为:"D:/桌面/音乐播放器"

也就是说所谓的工作目录,就是idea打开的这个文件夹旁边所显示的路径就是工作目录路径

通过运行System.getProperty("user.dir")也能获取工作目录路径

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件对象MultipartFile和文件对象File的使用方法 的相关文章

  • PMBOK(第六版) PMP笔记——《第十章 项目沟通管理》

    第十章 项目沟通管理 PM 大多数时间都用在与干系人的沟通上 第十章有三个过程 规划沟通管理 根据干系人的需求 制定沟通管理计划 管理沟通 根据沟通管理计划发布 收集 处理信息 监督沟通 确保在正确时间将正确信息传递给正确的人 1 10 1
  • 花生壳内网穿透+Windows系统,如何搭建网站?

    1 准备工作 在百度搜索 Win7下安装Apache PHP MySQL 根据搜到的教程自行安装WAMP环境 如果在网页上键入http 127 0 0 1 nbsp 出现以下页面表示您的服务器已经建好 下一步就是关键 如何通过花生壳内网穿透

随机推荐

  • 大家平时天天说的分布式系统到底是什么东西

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 从单块系统说起 团队越来越大 业务越来越复杂 分布式出现 庞大系统分而治之 分布式系统所带来的技术问题 一句话总结 什么是分布式系统设计和开发经验 补充说明 中
  • 【死磕 NIO】— ServerSocketChannel 的应用实例

    大家好 我是大明哥 一个专注于 死磕 Java 的程序员 死磕 Java 系列为作者 chenssy 倾情打造的 Java 系列文章 深入分析 Java 相关技术核心原理及源码 死磕 Java https www cmsblogs com
  • java大数据开发训练营--Java Web 后端技术基础(下)之Spring IOC控制反转

    一 Spring概述 1 1 Spring是什么 Spring是分层的 Java SE EE应用 full stack 全栈式 轻量级开源框架 提供了表现层 SpringMVC和持久层 Spring JDBC Template以及 业务层
  • 目标检测 3—— 人脸检测

    笔记来源 DeepLearning 500 questions 上次学习了目标检测的基本概念 Two Stage和 One Stage 算法 1 目标检测Two Stage 2 目标检测One Stage 4 人脸检测 在目标检测领域可以划
  • rk3368 Android9.0 HIDL调试记录

    rk3368 Android9 0 HIDL调试记录 Platform RK3368 OS Android 9 0 Kernel 4 4 194 文章目录 rk3368 Android9 0 HIDL调试记录 1 使用hidl gen工具生
  • AD使用插件生成交互式BOM

    AD使用插件生成交互式BOM 1 下载AD用交互式BOM插件 首先前往GitHub下载这位大佬开发的插件 地址 https github com lianlian33 InteractiveHtmlBomForAD 下载完成后打开文件所在位
  • 请实现一个简单的网页计算器(vue)

    练习一下父组件向子组件传值 计算部分用eval方法实现 运行截图如下 话不多说 上代码 页面结构 div div
  • JAVA08_Stream流anyMatch和allMatch和noneMatch的区别

    allMatch全匹配 判断数据列表中全部元素都符合设置的predicate条件 如果是就返回true 否则返回false 流为空时总是返回true 接口定义 boolean allMatch Predicate
  • 【华为】Redis客户端API使用(java)

    1 概述 目标读者 本文档专供需要Redis客户端API调用的开发人员 适用于具备Java开发经验的开发人员 简介 Redis客户端通过API调用 向Redis发起命令调用 向Redis或写入或读出数据 基本概念 Redis服务端 提供服务
  • 计算机cpi的公式,EAC=BAC/CPI;EAC=AC+( BAC-EV)/CPI公式分别在什么情况下使用?

    EAC BAC CPI EAC AC BAC EV CPI公式分别在什么情况下使用 来源 信管网 2018年10月30日 所有评论 横渡大漠 cnitpm com 08 21 35 帮忙解释一下 什么情况下用EAC BAC CPI 算 什么
  • 木兰开源社区分论坛

    ChinaOSC 2022 木兰开源社区 技术论坛将于 2022年8月21日15 00 17 30 在陕西省西安高新国际会议中心 会议室 召开 聚焦开源许可证与标准 探索开源发展模式 为国内开源产业打地基 木兰开源社区做了什么 还要怎么做
  • 黑客攻防入门(二)shellcode构造

    1 概说 shell我们都知道是什么了吧 狭义的shellcode 就是一段可以运行shell的代码 构造一段shellcode的作用就是为了在缓冲区溢出时将shellcode的地址覆盖掉正常的返回地址 shellcode通常放在缓冲区内
  • 视觉工程师手写文档之优秀程序员指南篇

    首先 这是我从第一次开始走出校园就一直在完善的一些指南 本来是给自己看的 但现在离职期间再翻看到之后 感触良多 就做了分享 里面很多内容是我在CSDN技术博客上看到的 我认为写的很好的 有些是我自己的总结 大家看看就好
  • Android 中简单计时器的实现方法(Handler和TimerTask)

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 方法一 用handler线程创建计时器 计时器效果如下 第一步 写xml文件
  • 09-1_Qt 5.9 C++开发指南_Qchart概述

    Qt Charts 可以很方便地绘制常见的折线图 柱状图 饼图等图表 不用自己耗费时间和精力开发绘图组件或使用第三方组件了 本章首先介绍 Qt Charts 的基本特点和功能 以画折线图为例详细说明 Qt Charts 各主要部件的操作方法
  • 算法基础课:第一讲——基础算法

    文章目录 前言 排序 1 快速排序 作用 算法思想 模板 例题 AC代码 2 归并排序 作用 算法思想 模板 例题 AC代码 二分 1 整数二分 作用 算法思想 模板 例题 AC代码 总结 2 浮点数二分 算法思想 模板 例题 AC代码 高
  • vue中ref的使用

    今天看了别人写的代码 有些地方不太理解 查阅资料之后真的是受益匪浅 在这里分享给大家
  • 从0到1使用 Webpack5 + React + TS 构建标准化应用

    前言 本篇文章主要讲解如何从一个空目录开始 建立起一个基于webpack react typescript的标准化前端应用 技术栈 webpack5 React18 TS 工程化 eslint prettier husky git hook
  • 田志刚:个人知识管理常用软件、工具介绍

    一把菜刀 厨师可以用来做出可口的美味佳肴 也可以被犯罪分子利用作为伤害人的凶器 这就是工具的特性 个人知识管理的工具 软件也是如此 个人知识管理工具 软件和系统是个人管理自己知识的一个热点问题 我们认为在工具的选择和使用上主要需做到知理 知
  • 文件对象MultipartFile和文件对象File的使用方法

    1 前端上传的文件对象file public String upload MultipartFile file throws IOException String originalFilename file getOriginalFilen