私は以下の方法を使用して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
ヒープを追加しましたが、それでもエラーが発生します。
したがって、これを修正するプログラム的な方法はありますか?変換中にマルチパートファイルを小さなチャンクに分割する可能性がありますが、コーディング方法がわかりません。
どんな助けや提案も大歓迎です。
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;
}
以下のコードは、ファイルをチャンクに分割するのに役立ち、次に集約する必要があります
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);
}
}
TransferToを使用するのはどうですか?
public File convert(MultipartFile file) throws IOException
{
File convFile = new File(file.getOriginalFilename());
file.transferTo(convFile);
return convFile;
}