From fe65eccdf7b8be0796c07e6cccef998440c77611 Mon Sep 17 00:00:00 2001 From: bestsort Date: Sat, 14 Mar 2020 19:19:35 +0800 Subject: [PATCH] reduce: memory usage during image upload (#659) * optimize FileHandler's logic * fix code style * fix: maybe happen OOM when file upload, see #529 * refactor: HashMap -> ConcurrentHashMap * remove unused class * reduce memory usage during image upload * code clean --- .../app/handler/file/AliOssFileHandler.java | 8 ++++---- .../app/handler/file/BaiduBosFileHandler.java | 8 ++++---- .../halo/app/handler/file/LocalFileHandler.java | 4 +++- .../app/handler/file/TencentCosFileHandler.java | 8 ++++---- .../halo/app/handler/file/UpOssFileHandler.java | 8 ++++---- .../java/run/halo/app/utils/ImageUtils.java | 17 +++++++++++++++++ 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/main/java/run/halo/app/handler/file/AliOssFileHandler.java b/src/main/java/run/halo/app/handler/file/AliOssFileHandler.java index 2e9812a8b..c8f3ec444 100644 --- a/src/main/java/run/halo/app/handler/file/AliOssFileHandler.java +++ b/src/main/java/run/halo/app/handler/file/AliOssFileHandler.java @@ -18,7 +18,7 @@ import run.halo.app.service.OptionService; import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.ImageUtils; -import java.awt.image.BufferedImage; +import javax.imageio.ImageReader; import java.util.Objects; /** @@ -106,9 +106,9 @@ public class AliOssFileHandler implements FileHandler { // Handle thumbnail if (FileHandler.isImageType(uploadResult.getMediaType())) { - BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); - uploadResult.setWidth(image.getWidth()); - uploadResult.setHeight(image.getHeight()); + ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension); + uploadResult.setWidth(image.getWidth(0)); + uploadResult.setHeight(image.getHeight(0)); if (ImageUtils.EXTENSION_ICO.equals(extension)) { uploadResult.setThumbPath(filePath); } else { diff --git a/src/main/java/run/halo/app/handler/file/BaiduBosFileHandler.java b/src/main/java/run/halo/app/handler/file/BaiduBosFileHandler.java index 5d0325e59..70a00cd56 100644 --- a/src/main/java/run/halo/app/handler/file/BaiduBosFileHandler.java +++ b/src/main/java/run/halo/app/handler/file/BaiduBosFileHandler.java @@ -19,7 +19,7 @@ import run.halo.app.service.OptionService; import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.ImageUtils; -import java.awt.image.BufferedImage; +import javax.imageio.ImageReader; import java.util.Objects; /** @@ -87,9 +87,9 @@ public class BaiduBosFileHandler implements FileHandler { // Handle thumbnail if (FileHandler.isImageType(uploadResult.getMediaType())) { - BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); - uploadResult.setWidth(image.getWidth()); - uploadResult.setHeight(image.getHeight()); + ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension); + uploadResult.setWidth(image.getWidth(0)); + uploadResult.setHeight(image.getHeight(0)); if (ImageUtils.EXTENSION_ICO.equals(extension)) { uploadResult.setThumbPath(filePath); } else { diff --git a/src/main/java/run/halo/app/handler/file/LocalFileHandler.java b/src/main/java/run/halo/app/handler/file/LocalFileHandler.java index d1360bf22..6e6b53634 100644 --- a/src/main/java/run/halo/app/handler/file/LocalFileHandler.java +++ b/src/main/java/run/halo/app/handler/file/LocalFileHandler.java @@ -236,7 +236,9 @@ public class LocalFileHandler implements FileHandler { log.warn("Failed to generate thumbnail: " + thumbPath, t); } finally { // Disposes of this graphics context and releases any system resources that it is using. - originalImage.getGraphics().dispose(); + if (originalImage != null) { + originalImage.getGraphics().dispose(); + } } return result; } diff --git a/src/main/java/run/halo/app/handler/file/TencentCosFileHandler.java b/src/main/java/run/halo/app/handler/file/TencentCosFileHandler.java index a7cbd62d9..cd5473fbf 100644 --- a/src/main/java/run/halo/app/handler/file/TencentCosFileHandler.java +++ b/src/main/java/run/halo/app/handler/file/TencentCosFileHandler.java @@ -22,7 +22,7 @@ import run.halo.app.service.OptionService; import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.ImageUtils; -import java.awt.image.BufferedImage; +import javax.imageio.ImageReader; import java.util.Objects; /** @@ -118,9 +118,9 @@ public class TencentCosFileHandler implements FileHandler { // Handle thumbnail if (FileHandler.isImageType(uploadResult.getMediaType())) { - BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); - uploadResult.setWidth(image.getWidth()); - uploadResult.setHeight(image.getHeight()); + ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension); + uploadResult.setWidth(image.getWidth(0)); + uploadResult.setHeight(image.getHeight(0)); if (ImageUtils.EXTENSION_ICO.equals(extension)) { uploadResult.setThumbPath(filePath); } else { diff --git a/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java b/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java index 8832fc0a9..f034924d3 100644 --- a/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java +++ b/src/main/java/run/halo/app/handler/file/UpOssFileHandler.java @@ -16,7 +16,7 @@ import run.halo.app.service.OptionService; import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.ImageUtils; -import java.awt.image.BufferedImage; +import javax.imageio.ImageReader; import java.util.Objects; /** @@ -86,9 +86,9 @@ public class UpOssFileHandler implements FileHandler { // Handle thumbnail if (FileHandler.isImageType(uploadResult.getMediaType())) { - BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); - uploadResult.setWidth(image.getWidth()); - uploadResult.setHeight(image.getHeight()); + ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension); + uploadResult.setWidth(image.getWidth(0)); + uploadResult.setHeight(image.getHeight(0)); if (ImageUtils.EXTENSION_ICO.equals(extension)) { uploadResult.setThumbPath(filePath); } else { diff --git a/src/main/java/run/halo/app/utils/ImageUtils.java b/src/main/java/run/halo/app/utils/ImageUtils.java index e5205e760..d965c5602 100644 --- a/src/main/java/run/halo/app/utils/ImageUtils.java +++ b/src/main/java/run/halo/app/utils/ImageUtils.java @@ -4,9 +4,12 @@ import lombok.extern.slf4j.Slf4j; import net.sf.image4j.codec.ico.ICODecoder; import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; +import java.util.Iterator; /** * @author ryanwang @@ -26,4 +29,18 @@ public class ImageUtils { return ImageIO.read(is); } } + + public static ImageReader getImageReaderFromFile(InputStream is,String formatName) { + try { + Iterator readerIterator = ImageIO.getImageReadersByFormatName(formatName); + ImageReader reader = readerIterator.next(); + ImageInputStream stream = ImageIO.createImageInputStream(is); + ImageIO.getImageReadersByFormatName(formatName); + reader.setInput(stream, true); + return reader; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } }