最近的项目中需要实现一个上传文件并解析的功能,本来觉得难点在于解析里面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进行开发,参数配置方法如下:
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})这一行代码是为了排除冲突依赖
如果你使用的是SpringMvc的话,则需要在xml中增加一个bean
maxInMemorySize的大小视实际情况而定就好。
但是最后我还是没用这种文件转换的方法,嘻嘻。