springboot undertow 上传文件报错临时目录找不到

蜡笔小新_ 发布于 03/16 11:59
阅读 825
收藏 1

解读下一代网络:算力网络正从理想照进现实!>>>

springboot undertow上传excel并解析,加载文件的时候报错:

java.nio.file.NoSuchFileException: C:\Users\Administrator\AppData\Local\Temp\undertow4185432720592173868upload
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)
    at java.nio.file.Files.newByteChannel(Files.java:361)
    at java.nio.file.Files.newByteChannel(Files.java:407)
    at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
    at java.nio.file.Files.newInputStream(Files.java:152)
    at io.undertow.server.handlers.form.FormData$FileItem.getInputStream(FormData.java:240)
    at io.undertow.servlet.spec.PartImpl.getInputStream(PartImpl.java:63)
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.getInputStream(StandardMultipartHttpServletRequest.java:251)
    at cn.myons.wb.waybill.service.UpWaybillService.importWaybillWeight(UpWaybillService.java:60)
    at cn.myons.wb.waybill.service.UpWaybillService$$FastClassBySpringCGLIB$$cca6d6e5.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:769)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:747)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115)
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
    at java.util.concurrent.FutureTask.run(FutureTask.java)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

百度了下一些各种临时目录配置都不起作用,请教各位同仁。

以下是问题补充:

@蜡笔小新_:报错是报在了multipartFile.getInputStream()这里; 尝试直接上传到服务器中再去用file获取inputStream是可以的,但是只有第一次可以,重启又可以了。每次启动后只有第一次可以。。。。 (03/16 15:19)
@蜡笔小新_:报错都是在操作 multipartFile 对象发生的 (03/16 15:46)
加载中
0
原来是大强
原来是大强
@Configuration
public class MultipartConfig {

   @Value("${files_location_temp}")
   private String locationTemp;

   @Bean
   MultipartConfigElement multipartConfigElement() {
      MultipartConfigFactory factory = new MultipartConfigFactory();
      File tmpFile = new File(locationTemp);
      if (!tmpFile.exists()) {
         tmpFile.mkdirs();
      }
      factory.setLocation(locationTemp);
      return factory.createMultipartConfig();
   }

}
蜡笔小新_
蜡笔小新_
试过了,不起作用...
0
SpringBoot中文社区
SpringBoot中文社区

你咋配置的?

spring.servlet.multipart.location=/tmp

 

Floki
Floki
回复 @蜡笔小新_ : 请问你这个问题解决了么
蜡笔小新_
蜡笔小新_
回复 @SpringBoot中文社区 : 配置完location后异常位置变了"java.nio.file.NoSuchFileException: C:\data\app\temp\undertow4790259573339515157upload",是生效了的。 报错是报在了multipartFile.getInputStream()这里。我尝试用直接上传到服务器文件夹下在读取,只有第一次可以
SpringBoot中文社区
SpringBoot中文社区
回复 @蜡笔小新_ : 我看你配置里面,临时目录读取的是系统默认的目录,不是你设置的目录啊?是不是配置没生效,?
SpringBoot中文社区
SpringBoot中文社区
回复 @蜡笔小新_ : 你要确定这个目录存在啊。不存在,要先创建。一般你直接用系统的临时目录就好了。
蜡笔小新_
蜡笔小新_
我是这样配置的: servlet: multipart: enabled: true location: /data/app/temp 不起作用
0
Bruin9527
Bruin9527

哈咯,请问解决了吗,springboot官网这个问题讨论了很久,有关/tmp定期删除的原因,但是没有个官方的解决方法,tomcat倒是修复了一个版本,没验证是否可以,但 undertow 还不行,

spring.http.multipart.location=/data/app/logs/xxljob # 上传文件的临时目录     spring.servlet.multipart.location=/data/app/logs/xxljob       server.tomcat.basedir=/data/app/logs/xxljob
都试了,似乎都不行。包括-Djava.io.tmpdir=/data/logs/xxjob 启动命令。保存还是指到/tmp/undertow4790259573339515157upload 文件不存在。

在想是不是因为通过zuul路由导致的。因为系统是走zuul路由代理访问服务的,之前运维处理这个问题就是重启gate服务,但是相关配置加上也不行。

0
dongjunv5
dongjunv5
spring.servlet.multipart.location=${java.io.tmpdir}
返回顶部
顶部