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
pull/662/head
bestsort 2020-03-14 19:19:35 +08:00 committed by GitHub
parent e357b7a462
commit fe65eccdf7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 36 additions and 17 deletions

View File

@ -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 {

View File

@ -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 {

View File

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

View File

@ -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 {

View File

@ -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 {

View File

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