우리는 프로젝트 개발을 위해 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 마이크로서비스를 시작하면 업로드가 가능합니다(로컬 마이크로서비스를 시작하면 해당 임시 디렉터리가 생성되기 때문입니다). 마침내 마이크로서비스가 시작되었고 결과가 실제로 업로드될 수 있었습니다.
피상적인 방법으로 문제를 해결하고 끝내고 싶지 않습니다. 마지막으로 검색된 기사와 분석을 바탕으로 개인적으로 다음과 같은 세 가지 해결책이 있다고 생각합니다.
모든 임시 디렉터리를 강제로 직접 지정하면 세련된 관리로 업로드된 파일의 tomcat 디렉터리가 지워지지 않습니다.
/tmp 디렉토리의 정리 규칙은 주로 /usr/lib/tmpfiles.d/tmp.conf 파일의 설정에 따라 다릅니다.
이 파일을 구성할 수 있습니다. /tmp 디렉터리에서 tomcat으로 시작하는 파일을 자동으로 정리한 후 구성 파일에 다음 내용을 추가합니다.
x /tmp/tomcat.*
임시 저장소 경로를 변경합니다. 파일을 저장하고 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(); } }
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
문제가 발생하면 표면적으로만 문제가 해결되었다고 볼 수 있습니다. 그러나 기술로서 우리는 그것을 일으키는 원인을 조사해야 합니다. 나는 또한 많은 훌륭한 전문가들이 자신들이 발견한 문제와 해결책을 공유할 수 있게 해주는 인터넷에 매우 감사하고 있습니다. 동시에 근본 원인부터 문제를 해결하는 데 도움이 되는 원리도 설명합니다.
멀티파트 서블릿 요청을 구문 분석할 수 없습니다. 중첩된 예외는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!