Java 대용량 파일 업로드 상세 정보 및 인스턴스 코드
선언:
지난주에 이런 문제가 발생하여 고객이 고화질 영상(1G 이상)을 업로드할 때 업로드에 실패했다.
처음에는 세션이 만료되거나 파일 크기가 시스템에 의해 제한되어 오류가 발생했다고 생각했습니다.시스템의 프로필을 보았지만 파일 크기 제한을 보지 못했습니다. 웹.xml에서seesiontimeout은 30입니다. 120으로 바꿨습니다.그래도 안 돼, 때로는 10분이면 죽을 때가 있어.
동료는 고객이 여기 있는 서버의 네트워크 파동으로 인해 네트워크 연결이 끊어졌는지 일리가 있다고 말했다.그러나 나는 로컬 테스트를 할 때 업로드도 실패했고 인터넷 원인은 배제되었다는 것을 발견했다.
로그를 보았습니다. 오류는 다음과 같습니다.
java.lang.OutOfMemoryError Java heap space
업로드 파일 코드는 다음과 같습니다.
public static String uploadSingleFile(String path,MultipartFile file) {
if (!file.isEmpty()) {
byte[] bytes;
try {
bytes = file.getBytes();
// Create the file on server
File serverFile = createServerFile(path,file.getOriginalFilename());
BufferedOutputStream stream = new BufferedOutputStream(
new FileOutputStream(serverFile));
stream.write(bytes);
stream.flush();
stream.close();
logger.info("Server File Location="
+ serverFile.getAbsolutePath());
return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(e.getMessage());
}
}else{
System.out.println(" ");
}
return null;
}
언뜻 보기에는 큰 문제가 없다. 나는stream에 있다.write(bytes); 이 말에 단점을 더해서 전혀 도착하지 않았다는 것을 알아차렸다.bytes = file입니다.getBytes(); 잘못 보고했어.왜냐하면 파일이 너무 크면 바이트 수가 Integer(Bytes[] 그룹)의 최대치를 초과해서 문제가 발생한 것 같습니다.
기왕 이렇게 된 바에야 서류를 조금씩 읽어 넣으면 된다.
업로드 코드를 수정하려면 다음과 같이 하십시오.
public static String uploadSingleFile(String path,MultipartFile file) {
if (!file.isEmpty()) {
//byte[] bytes;
try {
//bytes = file.getBytes();
// Create the file on server
File serverFile = createServerFile(path,file.getOriginalFilename());
BufferedOutputStream stream = new BufferedOutputStream(
new FileOutputStream(serverFile));
int length=0;
byte[] buffer = new byte[1024];
InputStream inputStream = file.getInputStream();
while ((length = inputStream.read(buffer)) != -1) {
stream.write(buffer, 0, length);
}
//stream.write(bytes);
stream.flush();
stream.close();
logger.info("Server File Location="
+ serverFile.getAbsolutePath());
return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(e.getMessage());
}
}else{
System.out.println(" ");
}
return null;
}
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.