Java 대용량 파일 업로드 상세 정보 및 인스턴스 코드

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;  
}
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기