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.FilenameUtils;
import run.halo.app.utils.ImageUtils; import run.halo.app.utils.ImageUtils;
import java.awt.image.BufferedImage; import javax.imageio.ImageReader;
import java.util.Objects; import java.util.Objects;
/** /**
@ -106,9 +106,9 @@ public class AliOssFileHandler implements FileHandler {
// Handle thumbnail // Handle thumbnail
if (FileHandler.isImageType(uploadResult.getMediaType())) { if (FileHandler.isImageType(uploadResult.getMediaType())) {
BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension);
uploadResult.setWidth(image.getWidth()); uploadResult.setWidth(image.getWidth(0));
uploadResult.setHeight(image.getHeight()); uploadResult.setHeight(image.getHeight(0));
if (ImageUtils.EXTENSION_ICO.equals(extension)) { if (ImageUtils.EXTENSION_ICO.equals(extension)) {
uploadResult.setThumbPath(filePath); uploadResult.setThumbPath(filePath);
} else { } else {

View File

@ -19,7 +19,7 @@ import run.halo.app.service.OptionService;
import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.FilenameUtils;
import run.halo.app.utils.ImageUtils; import run.halo.app.utils.ImageUtils;
import java.awt.image.BufferedImage; import javax.imageio.ImageReader;
import java.util.Objects; import java.util.Objects;
/** /**
@ -87,9 +87,9 @@ public class BaiduBosFileHandler implements FileHandler {
// Handle thumbnail // Handle thumbnail
if (FileHandler.isImageType(uploadResult.getMediaType())) { if (FileHandler.isImageType(uploadResult.getMediaType())) {
BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension);
uploadResult.setWidth(image.getWidth()); uploadResult.setWidth(image.getWidth(0));
uploadResult.setHeight(image.getHeight()); uploadResult.setHeight(image.getHeight(0));
if (ImageUtils.EXTENSION_ICO.equals(extension)) { if (ImageUtils.EXTENSION_ICO.equals(extension)) {
uploadResult.setThumbPath(filePath); uploadResult.setThumbPath(filePath);
} else { } else {

View File

@ -236,7 +236,9 @@ public class LocalFileHandler implements FileHandler {
log.warn("Failed to generate thumbnail: " + thumbPath, t); log.warn("Failed to generate thumbnail: " + thumbPath, t);
} finally { } finally {
// Disposes of this graphics context and releases any system resources that it is using. // 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; 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.FilenameUtils;
import run.halo.app.utils.ImageUtils; import run.halo.app.utils.ImageUtils;
import java.awt.image.BufferedImage; import javax.imageio.ImageReader;
import java.util.Objects; import java.util.Objects;
/** /**
@ -118,9 +118,9 @@ public class TencentCosFileHandler implements FileHandler {
// Handle thumbnail // Handle thumbnail
if (FileHandler.isImageType(uploadResult.getMediaType())) { if (FileHandler.isImageType(uploadResult.getMediaType())) {
BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension);
uploadResult.setWidth(image.getWidth()); uploadResult.setWidth(image.getWidth(0));
uploadResult.setHeight(image.getHeight()); uploadResult.setHeight(image.getHeight(0));
if (ImageUtils.EXTENSION_ICO.equals(extension)) { if (ImageUtils.EXTENSION_ICO.equals(extension)) {
uploadResult.setThumbPath(filePath); uploadResult.setThumbPath(filePath);
} else { } else {

View File

@ -16,7 +16,7 @@ import run.halo.app.service.OptionService;
import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.FilenameUtils;
import run.halo.app.utils.ImageUtils; import run.halo.app.utils.ImageUtils;
import java.awt.image.BufferedImage; import javax.imageio.ImageReader;
import java.util.Objects; import java.util.Objects;
/** /**
@ -86,9 +86,9 @@ public class UpOssFileHandler implements FileHandler {
// Handle thumbnail // Handle thumbnail
if (FileHandler.isImageType(uploadResult.getMediaType())) { if (FileHandler.isImageType(uploadResult.getMediaType())) {
BufferedImage image = ImageUtils.getImageFromFile(file.getInputStream(), extension); ImageReader image = ImageUtils.getImageReaderFromFile(file.getInputStream(), extension);
uploadResult.setWidth(image.getWidth()); uploadResult.setWidth(image.getWidth(0));
uploadResult.setHeight(image.getHeight()); uploadResult.setHeight(image.getHeight(0));
if (ImageUtils.EXTENSION_ICO.equals(extension)) { if (ImageUtils.EXTENSION_ICO.equals(extension)) {
uploadResult.setThumbPath(filePath); uploadResult.setThumbPath(filePath);
} else { } else {

View File

@ -4,9 +4,12 @@ import lombok.extern.slf4j.Slf4j;
import net.sf.image4j.codec.ico.ICODecoder; import net.sf.image4j.codec.ico.ICODecoder;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Iterator;
/** /**
* @author ryanwang * @author ryanwang
@ -26,4 +29,18 @@ public class ImageUtils {
return ImageIO.read(is); 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;
}
} }