临时上传位置[/tmp/tomcat.4296537502689403143.5000/work/Tomcat/localhost/ROOT]无效

时间:2018-05-25 07:10:06

标签: spring spring-boot embedded-tomcat-8

我正在使用Spring Boot 1.5.13版本。

我收到了如下的异常消息。

Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.4296537502689403143.5000/work/Tomcat/localhost/ROOT] is not valid

我在Spring Github问题中找到了这个问题。 https://github.com/spring-projects/spring-boot/issues/9616

但我仍有疑问。

  1. 我没有在我的应用中使用文件上传内容。但是日志说“无法解析多部分servlet请求”为什么会这样? (当我的应用程序使用RestTemplate(Post方法)时,我得到了异常
  2. 要解决这个异常,我重新启动了我的应用程序,但它没有立即生效。虽然我重新启动了我的应用程序,但它引用了不存在的tomcat目录。重启后一天,它工作。我想这个目录是在Spring的某个地方缓存的,或者......?
  3. 请帮帮我!

11 个答案:

答案 0 :(得分:15)

  1. http POST方法将使用这些临时位置来存储帖子数据。
  2. 像centOS这样的操作系统会经常删除临时目录。因此,即使您在一段时间后设置了该位置的权限,该操作系统也会删除该目录。重新启动后,临时目录会有所不同。
  3. 您可以在application.yml中设置多部分位置:

    spring:
      http:
        multipart:
          location: /data/upload_tmp
    

答案 1 :(得分:6)

只需重新启动服务器中的应用程序即可。这是spring和tomcat服务器之间的错误。应用程序重新启动后,它将在服务器中使用一个临时目录。

答案 2 :(得分:1)

问题已经回答,但也许我可以帮助某人。我也遇到了这个问题,但是没有建议的解决方案对我有用。

我们将Spring boot与Zuul结合使用,归结为以下内容:

  1. 停止应用程序
  2. 停止Zuul
  3. 删除/ tmp文件夹中与tomcat相关的文件夹(这是我们tomcat文件夹的存储位置,对于其他文件夹可能有所不同)
  4. 重新启动Zuul
  5. 重新启动应用程序

仅重新启动应用程序对我们而言不起作用,因为它指向的文件夹不存在:名称已缓存在某处。

使用Zuul时,请求首先通过Zuul,然后在其中引发异常。

答案 3 :(得分:0)

我的应用程序遇到同样的问题,我解决该问题的方法是重新启动应用程序,添加-java.tmp.dir = / path / to / application / temp /并在我的应用程序中创建一个/ temp /文件夹文件夹。

答案 4 :(得分:0)

在微服务架构中,问题可能是由于Zuul超时引起的。我遇到了同样的问题,并尝试了上面讨论的所有内容,但没有成功。在Zuul属性中使用dfs-bulk-service.ribbon.ReadTimeout = 90000配置增加超时后,它工作正常。 dfs-bulk-service是我的微服务名称,配置了Zuul作为api网关。

答案 5 :(得分:0)

此问题已在几天前修复。
春季靴:2.1.4或1.5.20

This version bump fixes an issue when the tmp dir was deleted
by the OS and the spring boot app tries to handle a multifile
upload.

问题:https://github.com/spring-projects/spring-boot/issues/9616

https://github.com/MeiSign/Copy-Pasta/commit/1200fb353a48a3d0c92038dee7cced7cebf3acfe

答案 6 :(得分:0)

很久以来我们也遇到了这个问题,我只是想表达一些与上面接受的答案中的2)有关的东西。

因此,这里的问题是tomcat的临时文件夹突然“消失”,而不是声称的“一般POST”,而是专门针对多部分请求。因此

spring.servlet.multipart.location / spring.http.multipart.location

涉及到这里。正如@Frankstar所说,在最近的Spring-boot代码中,此问题已通过“如果不存在则始终创建tmp-folder”来解决,当然,如果您运行的是超新鲜的弹簧, -启动。

您可以按照接受的答案中的建议将其指向/ tmp以外的其他位置,并且可以正常工作(尽管有关清理,您可能应该在这里https://github.com/spring-projects/spring-boot/issues/9983进行阅读-您现在很依赖在进行春季靴子清理时,应该应该工作正常)。

但是为什么文件夹实际上消失了?再往下走,@ Hasan Sawan说:“这是spring和tomcat服务器之间的错误”。但这是真的吗??

对我们来说,解决方案是配置这些东西。诸如CentOS之类的OS将使用systemd清理/ tmp(例如参见https://www.thegeekdiary.com/centos-rhel-7-how-tmpfiles-clean-up-tmp-or-var-tmp-replacement-of-tmpwatch),并且默认情况下将清理10天之内未访问的任何内容

因此,在我们的redhat服务器上,我们解决了这种编辑问题

/usr/lib/tmpfiles.d/tmp.conf

添加一行

X /tmp/tomcat.* 

解决此问题。您也可以使用

进行验证
# SYSTEMD_LOG_TARGET=console SYSTEMD_LOG_LEVEL=debug /usr/bin/systemd-tmpfiles --clean 2>&1 | grep tomcat 

,您将看到这些目录现在将被忽略。

对于系统也有此修复程序,而使用tmpwatch代替https://javahotfix.blogspot.com/2019/03/spring-boot-micro-services-tmptomcat.html

注意:上面提到的“重新启动”或仅#mkdir / tmp / tomcat ....的解决方案在我工作的地方根本不被接受。

答案 7 :(得分:0)

您可以通过 Content-Type:multipart / form-data 对POST请求的表单主体进行编码 http标头。

您应该发送 Content-Type:application / x-www-form-urlencoded POST

答案 8 :(得分:0)

对我来说,它使用的是正确的依赖项(如果使用java / maven)

       <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

答案 9 :(得分:0)

检查 C:/ 中的文件夹,如果没有一个名为 temp 的文件夹而不是创建它 C:/temp ,,, 这个解决方案对我有用< /p>

答案 10 :(得分:-1)

建议通过spring(或服务器)配置为临时存储指定自定义目录路径。

但是快速攻克方法是创建所提到的目录并提供读/写权限为

mkdir -p /tmp/tomcat.4296537502689403143.5000/work/Tomcat/localhost/ROOT

chmod 755 /tmp/tomcat.4296537502689403143.5000/work/Tomcat/localhost/ROOT

tomcat.xxxxxxxxxxxx.xxxx-每个服务器上都不同。 从服务器错误中使用此目录名称。