Spring Boot 응용 파일 업로드 오류 원인 및 해결 방안
4306 단어 SpringBoot업로드문건잘못 을 보고 하 다
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'값 을 읽 습 니 다.다음 소스 코드 는 다음 과 같 습 니 다.
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 애플 리 케 이 션 이 파일 타 임 스 를 올 리 는 오류 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.