mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-19 16:42:17 +03:00
0faf89b5ab
refs #4453 * On by default * Added config to disable resizing * Added basic image optimization processing * Added dep: sharp (optional dep) * Added resize middleware * Take care of rotation based on EXIF information * Removed all meta data from optimised image * Added handling if sharp could not get installed * Do not read ext twice - optimisation * Do not call sharp if config is disabled * Do not remove the original image which was uploaded (store 2 images) * Support of `req.files` for internal logic * Disabled cache to enable file removal on Windows
51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
const Promise = require('bluebird');
|
|
const common = require('../common');
|
|
|
|
/**
|
|
* @NOTE: Sharp cannot operate on the same image path, that's why we have to use in & out paths.
|
|
*
|
|
* We currently can't enable compression or having more config options, because of
|
|
* https://github.com/lovell/sharp/issues/1360.
|
|
*/
|
|
const process = (options = {}) => {
|
|
let sharp, img;
|
|
|
|
try {
|
|
sharp = require('sharp');
|
|
|
|
// @NOTE: workaround for Windows as libvips keeps a reference to the input file
|
|
// which makes it impossible to fs.unlink() it on cleanup stage
|
|
sharp.cache(false);
|
|
img = sharp(options.in);
|
|
} catch (err) {
|
|
return Promise.reject(new common.errors.InternalServerError({
|
|
message: 'Sharp wasn\'t installed',
|
|
code: 'SHARP_INSTALLATION',
|
|
err: err
|
|
}));
|
|
}
|
|
|
|
return img.metadata()
|
|
.then((metadata) => {
|
|
if (metadata.width > options.width) {
|
|
img.resize(options.width);
|
|
}
|
|
|
|
// CASE: if you call `rotate` it will automatically remove the orientation (and all other meta data) and rotates
|
|
// based on the orientation. It does not rotate if no orientation is set.
|
|
img.rotate();
|
|
})
|
|
.then(() => {
|
|
return img.toFile(options.out);
|
|
})
|
|
.catch((err) => {
|
|
throw new common.errors.InternalServerError({
|
|
message: 'Unable to manipulate image.',
|
|
err: err,
|
|
code: 'IMAGE_PROCESSING'
|
|
});
|
|
});
|
|
};
|
|
|
|
module.exports.process = process;
|