Java Convert MultipartFile в файл для больших файлов - PullRequest
0 голосов
/ 05 октября 2018

Я использую приведенный ниже метод для преобразования 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;
}

, который работает хорошо, но для больших файлов я получил это исключение:

java.lang.OutOfMemoryError: Java heap space

Я добавил ещекуча, но все еще с ошибкой.

Итак, есть ли программный способ исправить это, возможно, разделить многочастный файл на более мелкие куски при преобразовании, но я не уверен, как его кодировать.

Буду признателен за любую помощь или предложение.

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Ниже код поможет вам разделить файл на куски, а затем вам нужно объединить

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 голосов
/ 05 октября 2018

Как насчет использования TransferTo:

public File convert(MultipartFile file) throws IOException 
 {
  File convFile = new File(file.getOriginalFilename());
  file.transferTo(convFile);
  return convFile;
}
0 голосов
/ 05 октября 2018

Принадлежит ли 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;
  }
...