Spring Boot 응용 파일 업로드 오류 원인 및 해결 방안

문제 설명
Spring Boot 애플 리 케 이 션(기본 삽입 식 Tomcat 사용)은 파일 을 업로드 할 때 가끔 업로드 에 실패 하 는 경우 가 있 습 니 다.배경 오류 로그 정 보 는 다음 과 같 습 니 다."The temporary upload location is not valid".
원인 추적
이 문제 의 근본 원인 은 Tomcat 의 파일 업로드 메커니즘 으로 인 한 것 입 니 다!
Tomcat 는 파일 업 로드 를 처리 할 때 클 라 이언 트 가 업로드 한 파일 을 임시 디 렉 터 리 에 기록 합 니 다.이 임시 디 렉 터 리 는 기본적으로/tmp 경로 에 있 습 니 다.예 를 들 어"/tmp/tomcat.65744581312272268.18333/work/tomcat/localhost/ROOT"입 니 다.
운영 체 제 는/tmp 디 렉 터 리 에 대해 정 해진 시간 에 정리 하지 않 습 니 다.만약 에 운영 체제 의 정리 로 인해 해당 하 는 임시 디 렉 터 리 가 삭제 되면 클 라 이언 트 가 파일 을 다시 업로드 할 때 오류 가 발생 합 니 다."The temporary upload location is not valid".
실제 소스 코드 를 추적 해 보면 Tomcat 파일 업로드 임시 디 렉 터 리 를 명확 하 게 설정 하지 않 으 면 기본적으로 Servlet 컨 텍스트 대상 의 속성 인'javax.servlet.context.tempdir'값 을 읽 습 니 다.다음 소스 코드 는 다음 과 같 습 니 다.
  • org.apache.catalina.connector.Request
  • 
    private void parseParts(boolean explicit) {
      //...
      MultipartConfigElement mce = this.getWrapper().getMultipartConfigElement();
      //...
      //   MultipartConfigElement   location  
      String locationStr = mce.getLocation();
      File location;
      if (locationStr != null && locationStr.length() != 0) {
        location = new File(locationStr);
        if (!location.isAbsolute()) {
          location = (new File((File)context.getServletContext().getAttribute("javax.servlet.context.tempdir"), locationStr)).getAbsoluteFile();
        }
      } else {
        //   location     ,   Servlet        “javax.servlet.context.tempdir” ( :/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT)
        location = (File)context.getServletContext().getAttribute("javax.servlet.context.tempdir");
      }
      //...
    }
    해결 방법
    파일 을 업로드 하 는 임시 경로 가 삭 제 돼 문제 가 된 만큼 임시 디 렉 터 리 가 삭제 되 지 않도록 해 야 한다.
    2 가지 해결 방법:
    (1)Spring Boot 의 설정 매개 변수 인'spring.servlet.multipart.location'을 통 해 파일 을 업로드 할 임시 디 렉 터 리 를 명 확 히 지정 하여 이 경로 가 이미 존재 하고 이 디 렉 터 리 는 운영 체제 에서 삭제 되 지 않도록 합 니 다.
    
    spring.servlet.multipart.location=/data/tmp
    위 와 같이 파일 을 업로드 하 는 임시 디 렉 터 리 를 경로'/data/tmp'아래 로 지정 합 니 다.
    실제로 Spring Boot 에서 파일 업로드 에 대한 모든 설정 매개 변 수 는 다음 과 같 습 니 다.
    
    # MULTIPART (MultipartProperties)
    spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.
    spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.
    spring.servlet.multipart.location= # Intermediate location of uploaded files.
    spring.servlet.multipart.max-file-size=1MB # Max file size.
    spring.servlet.multipart.max-request-size=10MB # Max request size.
    spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.
    (2)Spring 용기 에 MultipartConfigElement 대상 을 명 확 히 등록 하고 MultipartConfigFactory 를 통 해 경 로 를 지정 합 니 다.
    상기 소스 코드 추적 에서 Tomcat 은MultipartConfigElement대상 의 location 속성 을 파일 을 업로드 하 는 임시 디 렉 터 리 로 사용 하 는 것 을 발견 했다.
    
    /**
     *           
     * @return
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
      MultipartConfigFactory factory = new MultipartConfigFactory();
      // tmp.dir          
      String path = System.getProperty("tmp.dir");
      if(path == null || "".equals(path.trim())) {
        path = System.getProperty("user.dir");
      }
      String location = path + "/tmp";
      File tmpFile = new File(location);
      //             
      if (!tmpFile.exists()) {
        tmpFile.mkdirs();
      }
      //              
      factory.setLocation(location);
      return factory.createMultipartConfig();
    }
    레 퍼 런 스
    https://stackoverflow.com/questions/50523407/the-temporary-upload-location-tmp-tomcat-4296537502689403143-5000-work-tomcat/50523578
    이상 은 Spring Boot 애플 리 케 이 션 이 파일 타 임 스 를 올 리 는 원인 과 해결 방안 에 대한 상세 한 내용 입 니 다.Spring Boot 애플 리 케 이 션 이 파일 타 임 스 를 올 리 는 오류 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기