mirror of https://github.com/halo-dev/halo
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 cleanpull/662/head
parent
e357b7a462
commit
fe65eccdf7
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue