web-dev-qa-db-fra.com

Java Convert MultipartFile to File pour les gros fichiers

J'utilise la méthode ci-dessous pour convertir MultipartFile en fichier:

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;
}

Le travail est bon mais pour les gros fichiers, j'ai cette exception:

Java.lang.OutOfMemoryError: Java heap space

J'ai ajouté plus de tas mais ayant toujours l'erreur.

Donc, existe-t-il un moyen programmé de résoudre ce problème, par exemple en scindant le fichier multipart en plus petits morceaux lors de la conversion, mais je ne sais pas comment le coder.

Toute aide ou suggestion serait grandement appréciée.

4

MultipartFile appartient-il au paquetage de Spring org.springframework.web.multipart? Si oui, vous pourriez faire

  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

Le code ci-dessous vous aidera à diviser le fichier en morceaux et vous devrez ensuite agréger

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

Que diriez-vous d'utiliser transferTo:

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