web-dev-qa-db-ja.com

Java MultipartFileを大きなファイルのファイルに変換する

私は以下の方法を使用してMultipartFileをファイルに変換しています:

public File convert(MultipartFile file) throws IOException {
        File convFile = new File(file.getOriginalFilename());
        convFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
}

Wichは問題なく動作しますが、大きなファイルの場合、次の例外が発生します。

Java.lang.OutOfMemoryError: Java heap space

ヒープを追加しましたが、それでもエラーが発生します。

したがって、これを修正するプログラム的な方法はありますか?変換中にマルチパートファイルを小さなチャンクに分割する可能性がありますが、コーディング方法がわかりません。

どんな助けや提案も大歓迎です。

4

MultipartFileはSpringのパッケージに属しますかorg.springframework.web.multipart?もしそうなら、あなたはすることができます

  public File convert(MultipartFile file) throws IOException {
    File convFile = new File(file.getOriginalFilename());
    convFile.createNewFile();
      try(InputStream is = file.getInputStream()) {
        Files.copy(is, convFile.toPath()); 
      }
    return convFile;
  }
1
Firman Wijaya

以下のコードは、ファイルをチャンクに分割するのに役立ち、次に集約する必要があります

try
        {
            file = new File(filePath.toString());
            messageDigest = MessageDigest.getInstance("MD5");
            checksum = getFileCheckSum(messageDigest, file);
            fileInputStream = new FileInputStream(file);
            int fileSize = (int) file.length();
            fileChannel = fileInputStream.getChannel();
            int numberOfChunks = (int) Math.ceil(fileChannel.size() / (double) chunkSize);
            int totalpacket = numberOfChunks;
            int totalFileSize = fileSize;
            int read = 0;

            while (numberOfChunks > 0)
            {

                System.out.println("file is :" + file + "checksum is:" + checksum);
                fileSize -= read;

                if (numberOfChunks > 1)
                {
                    ByteBuffer bytebuffer = ByteBuffer.allocate(chunkSize);
                    read = fileChannel.read(bytebuffer);
                    bytebuffer.flip();
                    String content = new String();
                    if (bytebuffer.hasRemaining())
                    {
                        content = new String(bytebuffer.array(), Charset.forName("UTF-8"));

                    }


                    bytebuffer.clear();

                }
                else
                {

                    String chunkData = new String();
                    ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);
                    fileChannel.read(byteBuffer);
                    chunkData = new String(byteBuffer.array(), Charset.forName("UTF-8"));
                    byteBuffer.clear();
                }

                numberOfChunks--;
            }
        }
        catch (IOException e)
        {
            log.info(e);
        }
        catch (NoSuchAlgorithmException nsae)
        {
            log.info(nsae);
        }
        finally
        {
            try
            {
                fileInputStream.close();
                fileChannel.close();
            }
            catch (IOException ioe)
            {
                log.info(ioe);
            }

        }
0
Kumar Panchal

TransferToを使用するのはどうですか?

public File convert(MultipartFile file) throws IOException 
 {
  File convFile = new File(file.getOriginalFilename());
  file.transferTo(convFile);
  return convFile;
}
0
PowerStat