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

Spring 临时上载位置[/tmp/tomcat.4296537502689403143.5000/work/tomcat/localhost/ROOT]无效,spring,spring-boot,embedded-tomcat-8,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 我在春季Github期刊上发现了这个问

我使用的是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
我在春季Github期刊上发现了这个问题。

但我对此仍有疑问

  • 我没有在我的应用程序中使用文件上载内容。但是日志说“无法解析多部分servlet请求”为什么?(我的应用程序使用RestTemplate(Post方法)时出现异常)
  • 为了解决这个异常,我重新启动了我的应用程序,但它没有立即工作。虽然我重新启动了我的应用程序,但它引用了不存在的tomcat目录。在重新启动后一天,它工作了。我猜该目录在春季或其他时候被缓存在某个地方了
  • 请帮帮我

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

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

    根据Vivek Sethi的评论,上述财产不适用于我,但以下一项适用于我

    spring.servlet.multipart.location=/data/upload_tmp
    

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

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

    问题已经得到回答,但也许我可以帮助某人。我也有这个问题,但建议的解决方案都不适合我

    我们将Spring boot与Zuul结合使用,可归结为以下几点:

  • 停止应用程序
  • 住手
  • 删除/tmp文件夹中与tomcat相关的文件夹(这是我们的tomcat文件夹的存储位置,其他文件夹可能不同)
  • 重新启动Zuul
  • 重新启动应用程序
  • 简单地重新启动应用程序对我们来说不起作用,因为它指向一个不存在的文件夹:名称被缓存在某个地方


    当使用Zuul时,请求首先通过Zuul并在那里抛出异常。

    在微服务体系结构中,问题可能是由于Zuul超时。我遇到了同样的问题,尝试了上面讨论的所有方法,但都不起作用。在我使用dfs bulk service.ribbon.ReadTimeout=90000配置Zuul属性增加超时后,它起作用了很好。这里的dfs批量服务是我的微服务名称,配置了Zuul作为api网关。

    这个问题几天前就解决了。
    弹簧靴: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.
    
    问题:


    我们很久以来也遇到过这个问题,我只是想在上面公认的答案中说明一些与2)有关的东西

    所以,这里的问题是tomcat的临时文件夹突然“消失”了,并不像所说的那样用于“一般的帖子”,而是专门用于多部分请求。因此

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

    这里涉及到。正如@Frankstar在上面所说的,在最近的spring引导代码中,这是通过“如果tmp文件夹不存在,则始终创建tmp文件夹”来修复的,当然,如果您正在运行一个超级新鲜的spring引导,它也会起作用

    您可以按照公认的答案中的建议,将其指向/tmp以外的其他地方,它会工作得很好(不过,关于清理,您也许应该在这里阅读一下-您现在依赖于spring boots cleanup,尽管它应该工作得很好)

    但为什么文件夹真的消失了?再往下看@Hasan Sawan说“这是spring和tomcat服务器之间的一个bug”。但这真的是

    对我们来说,解决方案就是配置这些东西。CentOS等操作系统将使用(例如参见))systemd进行清理/tmp,默认设置将清理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


    注意:上面提到的解决方案是“重新启动”或只是#mkdir/tmp/tomcat。。。。我工作的地方根本不接受。您可以通过内容类型:多部分/表单数据对POST请求的表单正文进行编码 http头


    您应该发送一个内容类型:application/x-www-form-urlencodedPOST

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

    
    公地io
    公地io
    2.6
    
    检查C://中的文件夹,如果没有一个名为temp的文件夹,则创建它C:/temp,,,此解决方案对我有效此属性已弃用。使用
    spring.servlet.multipart.location
    而不是对于希望指定非“tmp”位置的人,我使用了以下方法:
    spring.servlet.multipart.location:${user.dir}
    在我的应用程序中。yml
    spring.servlet.multipart.location
    在spring boot 1.5.9上不起作用,但
    spring.http.multipart.location
    起作用。@mavlan,这是临时解决方案,我们如何永久解决,即使这显示错误新位置未找到。我不认为这是一个临时解决方案。我们需要确保我们的应用程序可以在不同的系统上运行。CentOS将在某个时候删除临时目录。所以我们需要定义一个临时目录位置。所以它不受系统在临时目录上的行为的影响。同意,在微服务体系结构中,问题可能是由于Zuul造成的。我面对同样的问题,尝试了上面讨论的一切,但都没有成功。使用dfs批量服务增加超时后。ribbon.ReadTimeout=90000配置
           <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>