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

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

王林
풀어 주다: 2023-05-15 19:16:14
앞으로
1818명이 탐색했습니다.

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿