SpringBoot 프로젝트 파일 업로드 임시 대상 이상 처리 방안 삭제

1.업무 배경
저 희 는 SpringCloud 를 사용 하여 프로젝트 개발 을 했 습 니 다.그 중의 주요 서비스(이미지 업로드 와 관련 된)의 SpringBoot 마이크로 서 비 스 는 테스트 환경 에 있 습 니 다.이 항목 은 이미 출시 되 었 기 때문에 오랫동안 이 항목 간 에 관련 천 변경 과 포장 을 하지 않 았 습 니 다.
최근 이 프로젝트 의 업무 로 인해 갑 은 일부 기능 을 추가 해 야 한다.그러나 테스트 는 수업 을 올 릴 때 수업 표 지 를 올 려 야 하 는데 수업 표 지 를 올 린 사진 업로드 인터페이스 가 500 을 잘못 보고 한 것 을 발견 했다.
본인 은 백 엔 드 로그 디 렉 터 리 에서 도 오류 메 시 지 를 찾 을 수 없습니다.앞 뒤 만 분 리 된 전단 호출 인터페이스 일 때 다음 과 같은 오류 알림 을 되 돌려 줍 니 다.
Could not parse multipart servlet request;
nested exception is java.io.IOException:
The temporary upload location [/tmp/tomcat/ocalhost/ROOT] is not valid
마지막 으로 오류 알림 에 따라 검색 해 보 니 tomcat 의 임시 디 렉 터 리 가 삭제 되 었 습 니 다.마지막 으로 한 편의 문장 을 찾 아서 비교적 분명하게 말 하면 다음 과 같은 몇 가지 가 있다.
(1)SpringBoot 프로젝트 가 시작 되면 시스템 은 기본적으로/tmp 디 렉 터 리 에서 다음 세 개의 디 렉 터 리 를 자동 으로 생 성 합 니 다.
  • hsperfdata_root,
  • tomcat.*****************.8080,(끝 은 프로젝트 의 끝)
  • tomcat-docbase.*********.8080
  • (2),Multipart(form-data)방식 으로 요청 을 처리 할 때 기본 값 은 두 번 째 디 렉 터 리 에서 임시 파일 을 만 드 는 것 입 니 다.
    (3)、CentOS 7 임시 파일 디 렉 터 리 정리
    /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        
    상기 몇 가지 상황 에 따라 우리 가 파일 을 올 린 임시 디 렉 터 리 를 볼 수 있 고 CentOS 7 에서 10 일 마다 정기 적 으로 정리 합 니 다.
    그 러 자 글 에서 파일 을 올 리 는 임시 디 렉 터 리 가 존재 하지 않 는 다 는 말 이 나 오기 시 작 했 습 니 다.그래서 문 제 를 500 번 잘못 올 렸 습 니 다.내 동료 가 어떤 마이크로 서 비 스 를 시작 하 라 고 했 고 게 이 트 웨 이 서 비 스 를 시작 하면 된다 고 특정 적 으로 말 했다.
    그 나 저 나 SpringBoot 를 시작 하 는 모든 마이크로 서 비 스 를 업로드 할 수 있 습 니 다(이 컴퓨터 의 마이크로 서 비 스 를 시작 하면 해당 하 는 임시 디 렉 터 리 를 생 성 하기 때 문 입 니 다).마지막 으로 마이크로 서 비 스 를 시 작 했 는데,결 과 는 확실히 올 릴 수 있 었 다.
    나 는 문제 가 해결 되 기만 하면 수박 겉 핥 기 식 으로 문 제 를 해결 하면 일 을 끝 내 는 것 을 원 하지 않 는 다.마지막 으로 검 색 된 글 과 분석 에 따 르 면 개인 적 으로 다음 과 같은 세 가지 해결 방안 이 있다 고 생각 합 니 다.
    2.세 가지 해결 방안
    2.1 CentOS 정리 임시 항목 규칙 을 직접 수정
    모든 임시 디 렉 터 리 를 직접 폭력 적 으로 지정 하지 않 고 업로드 파일 tomcat 디 렉 터 리 를 정밀 하 게 관리 합 니 다.
    /tmp 디 렉 터 리 의 청소 규칙 은 주로/usr/lib/tmpfiles.d/tmp.conf 파일 의 설정 에 달 려 있 습 니 다.
    이 파일 을 설정 할 수 있 습 니 다.예 를 들 어 시스템 이 tomcat 로 시작 하 는 디 렉 터 리 를 자동 으로 청소 하고 싶 지 않 으 면 다음 내용 을 설정 파일 에 추가 하면 됩 니 다.
    
    x /tmp/tomcat.*
    2.2 SpringBoot 시작 설정 설명(@Configuration)을 통 해 자체 업로드 파일 디 렉 터 리 지정
    임시 파일 의 저장 경 로 를 바 꾸 고 CentOS 7 이 아 닌 시스템 의 기본 임시 디 렉 터 리 를 지정 하면 시스템 이 정시 에 임시 디 렉 터 리 를 삭제 하 는 상황 을 피 할 수 있 습 니 다.실현 코드 는 다음 과 같다.
    
    @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 설정 에서 Profile 정 보 를 설정 합 니 다.
    propertites/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.성과 표현


    4.총화
    우 리 는 문 제 를 만 났 는데,아마도 표면적 인 문제 가 이미 해결 되 었 다 는 것 만 보 았 을 것 이다.그러나 기술 로 서 어떤 원인 이 생 겼 는 지 깊이 따 져 봐 야 한다.많은 신 들 이 자신 이 발견 한 문제 와 해결 방안 을 공유 할 수 있 도록 인터넷 에 도 감사 하 다.근원 적 으로 문 제 를 해결 하 는 데 도움 이 된다 는 원리 도 설명 했다.
    SpringBoot 파일 업로드 문제 및 해결
    코드 오류
    Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [D:\\xyqbtest\\work\\Tomcat\\localhost\\xyqb\fs\\marvels-core-v2] is not valid
    해결 방안:
    springboot 에 파일 을 업로드 하 는 데 임시 디 렉 터 리 가 없어 서 이상 의 오 류 를 보고 할 수 있 습 니 다.application 설정 파일 에 임시 파일 디 렉 터 리 를 지정 해 야 합 니 다.
    server.tomcat.basedir=파일 경로
    spring.http.multiport.location=파일 경 로 를 설정 했다 면 이 경 로 를 추가 해 야 합 니 다.
    클래스 를 만 듭 니 다.다음 방법 이 포함 되 어 있 습 니 다:
    
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setLocation("./tmp");
        return factory.createMultipartConfig();
    }
    다시 시작 하면 유효 합 니 다.
    코드 오류
    Failed to convert value of type 'org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile' to required type 'org.springframework.web.multipart.commons.CommonsMultipartFile'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile' to required type 'org.springframework.web.multipart.commons.CommonsMultipartFile': no matching editors or conversion strategy found
    해결 방안:
    springmvc 에서 파일 을 받 는 것 은 Commons Multipart File 을 사용 하고 spring boot 는 Multipart File 을 사용 합 니 다.
    바 꾸 면 성공 할 수 있다.
    이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기