SpringBoot:关于MultipartFile和File不得不说的那些事

    最近的项目中需要实现一个上传文件并解析的功能,本来觉得难点在于解析里面10w+的用户数据,但是万万没想到问题出在了一个开始的接收参数上面。

    在项目中我们使用MultipartFile来接收postman传过来的文件,然而后面又需要将文件写入InputStreamReader,进而逐行读取文件内容并写入list中。由于我不能直接把MultipartFile写入到FileInputStream,再写入InputStreamReader,这就涉及到了一个问题,就是如何把MultipartFile类型的文件转化为File类型的文件(当然我们也可以直接先MultipartFile.getInputStream(),然后再把InputStream写入到InputStreamReader。这样可以避免MultipartFile和File的类型转换,并同样能实现功能。但是我不想绕开这个问题)。

先把代码放上来,代码肯定有写的不好的地方,请多包涵

文件上传代码

这段代码的思路大概就是先创建一个临时文件并保存到本地,然后调用MultipartFile.transferTo()方法,将MultipartFile类型的文件转化为File类型的文件。看起来很美好,但是在实现的过程中我还是遇到了一些问题,下面把我遇到的问题列出来,并给出我的解决方法,希望能帮助到同样遇到这些问题的朋友。


问题一:org.springframework.web.multipart.MultipartException: Current request is not a multipart request

这个错误是上传文件为空时候后台打印的异常,没什么可说的

问题二:FileNotFoundException: ${path}   (No such file or dictionary)

后台异常

在测试的时候,出现了这个问题。提示文件或是目录找不到,我用的Mac,出现了以上的路径;如果是Windows,会出现一个C盘的路径。最初我以为是代码没有权限在那个目录下面创建文件或者目录,导致NotFound异常。但后来发现不是这样,是临时文件根本没有被生成。实际上,有这么一个参数maxInMemorySize,默认是10M,文件大小小于这个值的文件是不会被写到本地的,因此出现了FileNotFoundException的错误。所以我们需要修改这个参数的大小,我这里设置为-1,意思是无论多大的文件都会被生成在本地。

我使用的是SpringBoot进行开发,参数配置方法如下:

Appliaction

@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})这一行代码是为了排除冲突依赖

如果你使用的是SpringMvc的话,则需要在xml中增加一个bean

xml配置

maxInMemorySize的大小视实际情况而定就好。

但是最后我还是没用这种文件转换的方法,嘻嘻。

推荐阅读更多精彩内容

  • 概述 java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。java.io ...
    Steven1997阅读 8,773评论 1 25
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,233评论 0 4
  • 在我的童年记忆深处,出现过一个梦,却永远定格在心里面。 起初,梦中的背景都是一片灰蒙蒙的。在几处悬崖边倚靠着一根巨...
    昕城阅读 197评论 5 6
  • 身边不少毕业多年的老司机, 心里都堵着一个疙瘩, 就是——学历低,不系大学僧。。。。 对于怎么提升学历,也没几个人...
    亦言一语话教育阅读 5,607评论 0 7
  • 这些天,在早上上班的高峰时段,街上的十字路口的环岛回旋处竟出现堵车的情况,这在我们这个小镇是不太可能发生的状况。原...
    彣彣彧彧熙熙皞皞阅读 232评论 0 0