>  기사  >  Java  >  SpringBoot 파일 업로드의 임시 대상이 삭제된 경우 예외 처리 방법

SpringBoot 파일 업로드의 임시 대상이 삭제된 경우 예외 처리 방법

王林
王林앞으로
2023-05-15 19:16:141781검색

1. 사업배경

우리는 프로젝트 개발을 위해 Spring Cloud를 사용하고 있으며, 주요 서비스 중 하나(이미지 업로드 포함) SpringBoot 마이크로서비스가 테스트 환경에 있습니다. 이 프로젝트는 이미 시작되었기 때문에 오랫동안 이 프로젝트에 대한 관련 릴리스 변경 및 패키징이 이루어지지 않았습니다.

최근 당사자 A가 이 프로젝트에 몇 가지 새로운 기능을 추가해야 하는 필요성으로 인해. 그런데 테스트 중에 강좌를 업로드할 때 강좌 표지를 업로드해야 하는데 강좌 표지 업로드를 위한 이미지 업로드 인터페이스에서 500 오류가 보고되는 것을 발견했습니다.

백엔드 로그 디렉터리에서 오류 메시지를 찾을 수 없습니다. 프런트엔드와 백엔드가 분리된 프런트엔드만 인터페이스 호출 시 다음 오류 메시지를 반환합니다.

멀티파트 서블릿 요청을 구문 분석할 수 없습니다.
중첩된 예외는 java.io.IOException입니다.
임시 업로드 위치 [/ tmp/tomcat/ocalhost/ROOT ] is not valid

드디어 오류 메시지대로 검색해 보니 tomcat의 임시 디렉터리가 삭제된 것으로 나타났습니다. 마지막으로 다음 사항을 더 명확하게 설명하는 기사를 찾았습니다.

(1) SpringBoot 프로젝트가 시작된 후 시스템은 기본적으로 /tmp 디렉터리에 다음 세 개의 디렉터리를 자동으로 생성합니다

  • hsperfdata_root ,

  • tomcat.************.8080, (끝은 프로젝트의 끝입니다)

  • tomcat-docbase.************ .8080

(2) Multipart(form-data)를 사용하여 요청을 처리할 때 기본적으로 두 번째 디렉터리에 임시 파일을 생성합니다

(3) CentOS7은 임시 파일 디렉터리를 정기적으로 정리합니다

/ tmp 디렉토리 정리 규칙은 주로 /usr/lib/tmpfiles.d/tmp.conf 파일의 설정에 따라 달라집니다. 기본 구성 내용은 다음과 같습니다.

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d           #   清理/tmp下10天前的目录和文件
v /var/tmp 1777 root root 30d       #   清理/var/tmp下30天前的目录和文件

위 조건을 기반으로 우리는 임시 디렉토리를 볼 수 있습니다. 업로드 파일은 CentOS7에 있으며 10일마다 정기적으로 정리됩니다.

그래서 기사 시작 부분에 업로드된 파일이 등장했던 임시 디렉터리가 존재하지 않아서 업로드 문제에서 오류 500이 보고되는 문제가 있었습니다. 제 동료가 특정 마이크로서비스 시작에 대해 말했고 특히 게이트웨이 서비스 시작에 대해 이야기했습니다.

SpringBoot 마이크로서비스를 시작하면 업로드가 가능합니다(로컬 마이크로서비스를 시작하면 해당 임시 디렉터리가 생성되기 때문입니다). 마침내 마이크로서비스가 시작되었고 결과가 실제로 업로드될 수 있었습니다.

피상적인 방법으로 문제를 해결하고 끝내고 싶지 않습니다. 마지막으로 검색된 기사와 분석을 바탕으로 개인적으로 다음과 같은 세 가지 해결책이 있다고 생각합니다.

2. 세 가지 솔루션

2.1 CentOS 정리 임시 디렉터리 규칙을 직접 수정합니다.

모든 임시 디렉터리를 강제로 직접 지정하면 세련된 관리로 업로드된 파일의 tomcat 디렉터리가 지워지지 않습니다.

/tmp 디렉토리의 정리 규칙은 주로 /usr/lib/tmpfiles.d/tmp.conf 파일의 설정에 따라 다릅니다.

이 파일을 구성할 수 있습니다. /tmp 디렉터리에서 tomcat으로 시작하는 파일을 자동으로 정리한 후 구성 파일에 다음 내용을 추가합니다.

x /tmp/tomcat.*

2.2. SpringBoot 시작 구성 주석(@Configuration)을 통해 고유한 업로드 파일 디렉터리를 지정합니다.

임시 저장소 경로를 변경합니다. 파일을 저장하고 CentOS7이 아닌 사용자 정의를 지정합니다. 시스템은 기본적으로 임시 디렉토리를 지정하므로 시스템이 정기적으로 임시 디렉토리를 지우는 것을 방지할 수 있습니다. 구현 코드는 다음과 같습니다

@Configuration
public class MultipartConfig { 
    /**
     * 文件上传临时路径
     */
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        String location = System.getProperty("user.dir") + "/data/upload/tmp";
        File tmpFile = new File(location);
        if (!tmpFile.exists()) {
            tmpFile.mkdirs();
        }
        factory.setLocation(location);
        return factory.createMultipartConfig();
    }
}

2.3. 원리는 두 번째 솔루션과 유사하지만 프로필 정보는 SpringBoot 구성에서 설정됩니다

properties/yaml 파일에서 구성합니다: spring.http.multipart.location= 캐시 파일 경로

spring.mvc.static-path-pattern=/upload/**
spring.http.multipart.max-file-size=10MB
#指定上传文件临时目录
spring.http.multipart.location=/opt/data/upload

3. 결과 표시

SpringBoot 파일 업로드의 임시 대상이 삭제된 경우 예외 처리 방법

SpringBoot 파일 업로드의 임시 대상이 삭제된 경우 예외 처리 방법

4. 요약

문제가 발생하면 표면적으로만 문제가 해결되었다고 볼 수 있습니다. 그러나 기술로서 우리는 그것을 일으키는 원인을 조사해야 합니다. 나는 또한 많은 훌륭한 전문가들이 자신들이 발견한 문제와 해결책을 공유할 수 있게 해주는 인터넷에 매우 감사하고 있습니다. 동시에 근본 원인부터 문제를 해결하는 데 도움이 되는 원리도 설명합니다.

SpringBoot 파일 업로드 문제 및 솔루션

1: 코드 오류

멀티파트 서블릿 요청을 구문 분석할 수 없습니다. 중첩된 예외는 java.io.IOException입니다. 임시 업로드 위치 [D:xyqbtestworkTomcatlocalhostxyqb fsmarvels-core-v2]는 그렇지 않습니다. valid

해결 방법:

springboot에는 파일 업로드를 위한 임시 디렉터리가 없으므로 위 오류가 보고됩니다. 애플리케이션 구성 파일

server.tomcat.basedir=파일 경로에 임시 파일 디렉터리를 지정해야 합니다.

구성된 경우 spring.http.multipart.location=file 경로가 지정된 경우 이 경로를 추가해야 합니다.

다음 메서드를 포함하는 클래스를 만듭니다.

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("./tmp");
    return factory.createMultipartConfig();
}

다시 시작하면 적용됩니다.

두 가지: 코드 오류

"org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile" 유형의 값을 필수 유형 "org.springframework.web.multipart.commons.CommonsMultipartFile"로 변환하지 못했습니다. 중첩된 예외는 java입니다. .lang.IllegalStateException: "org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile" 유형의 값을 필수 유형 "org.springframework.web.multipart.commons.CommonsMultipartFile"로 변환할 수 없습니다. 일치하는 편집기 또는 변환 전략을 찾을 수 없습니다

해결책:

CommonsMultipartFile은 springmvc에서 파일을 수신하는 데 사용되고 MultipartFile은 springboot에서 사용됩니다.

교체하면 성공합니다.

위 내용은 SpringBoot 파일 업로드의 임시 대상이 삭제된 경우 예외 처리 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제