aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/ApiManagers/UploadManager.ts88
-rw-r--r--src/server/DashUploadUtils.ts67
-rw-r--r--src/server/downsize.ts40
3 files changed, 52 insertions, 143 deletions
diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts
index ea5d8cb33..478f7da3d 100644
--- a/src/server/ApiManagers/UploadManager.ts
+++ b/src/server/ApiManagers/UploadManager.ts
@@ -1,7 +1,7 @@
import * as formidable from 'formidable';
import { createReadStream, createWriteStream, unlink, writeFile } from 'fs';
import { basename, dirname, extname, normalize } from 'path';
-import * as sharp from 'sharp';
+import Jimp from 'jimp';
import { filesDirectory, publicDirectory } from '..';
import { retrocycle } from '../../decycler/decycler';
import { DashUploadUtils, InjectSize, SizeSuffix } from '../DashUploadUtils';
@@ -13,6 +13,7 @@ import ApiManager, { Registration } from './ApiManager';
import { SolrManager } from './SearchManager';
import v4 = require('uuid/v4');
import { DashVersion } from '../../fields/DocSymbols';
+import { JPEGStream } from 'canvas';
const AdmZip = require('adm-zip');
const imageDataUri = require('image-data-uri');
const fs = require('fs');
@@ -164,7 +165,7 @@ export default class UploadManager extends ApiManager {
if (error) {
return res.send();
}
- await DashUploadUtils.outputResizedImages(() => createReadStream(resolvedPath), resolvedName, pathToDirectory(Directory.images));
+ await DashUploadUtils.outputResizedImages(resolvedPath, resolvedName, pathToDirectory(Directory.images));
res.send({
accessPaths: {
agnostic: DashUploadUtils.getAccessPaths(Directory.images, resolvedName),
@@ -261,34 +262,18 @@ export default class UploadManager extends ApiManager {
try {
zip.extractEntryTo(entry.entryName, publicDirectory, true, false);
createReadStream(pathname).pipe(createWriteStream(targetname));
- if (extension !== '.pdf') {
- const { pngs, jpgs } = AcceptableMedia;
- const resizers = [
- { resizer: sharp().resize(100, undefined, { withoutEnlargement: true }), suffix: SizeSuffix.Small },
- { resizer: sharp().resize(400, undefined, { withoutEnlargement: true }), suffix: SizeSuffix.Medium },
- { resizer: sharp().resize(900, undefined, { withoutEnlargement: true }), suffix: SizeSuffix.Large },
- ];
- let isImage = false;
- if (pngs.includes(extension)) {
- resizers.forEach(element => {
- element.resizer = element.resizer.png();
- });
- isImage = true;
- } else if (jpgs.includes(extension)) {
- resizers.forEach(element => {
- element.resizer = element.resizer.jpeg();
- });
- isImage = true;
- }
- if (isImage) {
- resizers.forEach(resizer => {
- createReadStream(pathname)
- .on('error', e => console.log('Resizing read:' + e))
- .pipe(resizer.resizer)
- .on('error', e => console.log('Resizing write: ' + e))
- .pipe(createWriteStream(targetname.replace('_o' + extension, resizer.suffix + extension)).on('error', e => console.log('Resizing write: ' + e)));
- });
- }
+ if (AcceptableMedia.imageFormats.includes(extension)) {
+ [
+ { size: 100, suffix: SizeSuffix.Small },
+ { size: 400, suffix: SizeSuffix.Medium },
+ { size: 900, suffix: SizeSuffix.Large },
+ ].forEach(resizer =>
+ Jimp.read(pathname).then(img =>
+ img
+ .resize(resizer.size, Jimp.AUTO) //
+ .write(targetname.replace('_o' + extension, resizer.suffix + extension))
+ )
+ );
}
unlink(pathname, () => {});
} catch (e) {
@@ -346,7 +331,7 @@ export default class UploadManager extends ApiManager {
method: Method.POST,
subscription: '/uploadURI',
secureHandler: ({ req, res }) => {
- const uri = req.body.uri;
+ const uri: any = req.body.uri;
const filename = req.body.name;
const origSuffix = req.body.nosuffix ? SizeSuffix.None : SizeSuffix.Original;
const deleteFiles = req.body.replaceRootFilename;
@@ -364,33 +349,20 @@ export default class UploadManager extends ApiManager {
return imageDataUri.outputFile(uri, serverPathToFile(Directory.images, InjectSize(filename, origSuffix))).then((savedName: string) => {
const ext = extname(savedName).toLowerCase();
const { pngs, jpgs } = AcceptableMedia;
- const resizers = !origSuffix
- ? [{ resizer: sharp().resize(400, undefined, { withoutEnlargement: true }), suffix: SizeSuffix.Medium }]
- : [
- { resizer: sharp().resize(100, undefined, { withoutEnlargement: true }), suffix: SizeSuffix.Small },
- { resizer: sharp().resize(400, undefined, { withoutEnlargement: true }), suffix: SizeSuffix.Medium },
- { resizer: sharp().resize(900, undefined, { withoutEnlargement: true }), suffix: SizeSuffix.Large },
- ];
- let isImage = false;
- if (pngs.includes(ext)) {
- resizers.forEach(element => {
- element.resizer = element.resizer.png();
- });
- isImage = true;
- } else if (jpgs.includes(ext)) {
- resizers.forEach(element => {
- element.resizer = element.resizer.jpeg();
- });
- isImage = true;
- }
- if (isImage) {
- resizers.forEach(resizer => {
- const path = serverPathToFile(Directory.images, InjectSize(filename, resizer.suffix) + ext);
- createReadStream(savedName)
- .on('error', e => console.log('Resizing read:' + e))
- .pipe(resizer.resizer)
- .on('error', e => console.log('Resizing write: ' + e))
- .pipe(createWriteStream(path).on('error', e => console.log('Resizing write: ' + e)));
+ if (!pngs.includes(ext) && !jpgs.includes(ext)) {
+ (!origSuffix
+ ? [{ size: 400, suffix: SizeSuffix.Medium }]
+ : [
+ { size: 100, suffix: SizeSuffix.Small },
+ { size: 400, suffix: SizeSuffix.Medium },
+ { size: 900, suffix: SizeSuffix.Large },
+ ]
+ ).forEach(resizer => {
+ Jimp.read(savedName).then(img =>
+ img
+ .resize(resizer.size, Jimp.AUTO) //
+ .write(serverPathToFile(Directory.images, InjectSize(filename, resizer.suffix) + ext))
+ );
});
}
res.send(clientPathToFile(Directory.images, filename + ext));
diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts
index 19cb3f240..b2616af1f 100644
--- a/src/server/DashUploadUtils.ts
+++ b/src/server/DashUploadUtils.ts
@@ -5,8 +5,7 @@ import { File } from 'formidable';
import { createReadStream, createWriteStream, existsSync, readFileSync, rename, unlinkSync, writeFile } from 'fs';
import * as path from 'path';
import { basename } from 'path';
-import * as sharp from 'sharp';
-import { Readable, Stream } from 'stream';
+import Jimp from 'jimp';
import { filesDirectory, publicDirectory } from '.';
import { Opt } from '../fields/Doc';
import { ParsedPDF } from '../server/PdfTypes';
@@ -55,9 +54,9 @@ export namespace DashUploadUtils {
}
export const Sizes: { [size: string]: Size } = {
- SMALL: { width: 100, suffix: SizeSuffix.Small },
- MEDIUM: { width: 400, suffix: SizeSuffix.Medium },
LARGE: { width: 900, suffix: SizeSuffix.Large },
+ MEDIUM: { width: 400, suffix: SizeSuffix.Medium },
+ SMALL: { width: 100, suffix: SizeSuffix.Small },
};
export function validateExtension(url: string) {
@@ -367,7 +366,7 @@ export namespace DashUploadUtils {
}
export interface ImageResizer {
- resizer?: sharp.Sharp;
+ width?: any; // sharp.Sharp;
suffix: SizeSuffix;
}
@@ -540,7 +539,7 @@ export namespace DashUploadUtils {
writtenFiles = {};
}
} else {
- writtenFiles = await outputResizedImages(() => request(requestable), resolved, pathToDirectory(Directory.images));
+ writtenFiles = await outputResizedImages(metadata.source, resolved, pathToDirectory(Directory.images));
}
for (const suffix of Object.keys(writtenFiles)) {
information.accessPaths[suffix] = getAccessPaths(images, writtenFiles[suffix]);
@@ -595,57 +594,35 @@ export namespace DashUploadUtils {
* @param outputDirectory the directory to output to, usually Directory.Images
* @returns a map with suffixes as keys and resized filenames as values.
*/
- export async function outputResizedImages(streamProvider: () => Stream | Promise<Stream>, outputFileName: string, outputDirectory: string) {
- const writtenFiles: { [suffix: string]: string } = {};
- for (const { resizer, suffix } of resizers(path.extname(outputFileName))) {
- const outputPath = path.resolve(outputDirectory, (writtenFiles[suffix] = InjectSize(outputFileName, suffix)));
- await new Promise<void>(async (resolve, reject) => {
- const source = streamProvider();
- let readStream = source instanceof Promise ? await source : source;
- let error = false;
- if (resizer) {
- readStream = readStream.pipe(resizer.withMetadata()).on('error', async args => {
- error = true;
- if (error) {
- const source2 = streamProvider();
- let readStream2: Stream | undefined;
- readStream2 = source2 instanceof Promise ? await source2 : source2;
- readStream2?.pipe(createWriteStream(outputPath)).on('error', resolve).on('close', resolve);
- }
+ export async function outputResizedImages(sourcePath: string, outputFileName: string, outputDirectory: string) {
+ return await new Promise<{ [suffix: string]: string }>(async resolve => {
+ Jimp.read(sourcePath).then(async img => {
+ const writtenFiles: { [suffix: string]: string } = {};
+ for (const { width, suffix } of resizers(path.extname(outputFileName))) {
+ const outputPath = path.resolve(outputDirectory, (writtenFiles[suffix] = InjectSize(outputFileName, suffix)));
+ await new Promise<void>(async res => {
+ if (!width) createReadStream(sourcePath).pipe(createWriteStream(outputPath)).on('close', res);
+ else img = img.resize(width, Jimp.AUTO).write(outputPath);
+ res();
});
}
- !error && readStream?.pipe(createWriteStream(outputPath)).on('error', resolve).on('close', resolve);
+ resolve(writtenFiles);
});
- }
- return writtenFiles;
+ });
}
/**
* define the resizers to use
* @param ext the extension
- * @returns an array of resizer functions from sharp
+ * @returns an array of resize descriptions
*/
function resizers(ext: string): DashUploadUtils.ImageResizer[] {
return [
{ suffix: SizeSuffix.Original },
- ...Object.values(DashUploadUtils.Sizes).map(({ suffix, width }) => {
- let initial: sharp.Sharp | undefined = sharp({ failOnError: false }).resize(width, undefined, { withoutEnlargement: true });
- if (pngs.includes(ext)) {
- initial = initial.png(pngOptions);
- } else if (jpgs.includes(ext)) {
- initial = initial.jpeg();
- } else if (webps.includes(ext)) {
- initial = initial.webp();
- } else if (tiffs.includes(ext)) {
- initial = initial.tiff();
- } else if (ext === '.gif') {
- initial = undefined;
- }
- return {
- resizer: suffix === '_o' ? undefined : initial,
- suffix,
- };
- }),
+ ...[...(AcceptableMedia.imageFormats.includes(ext) ? Object.values(DashUploadUtils.Sizes) : [])].map(({ suffix, width }) => ({
+ width,
+ suffix,
+ })),
];
}
}
diff --git a/src/server/downsize.ts b/src/server/downsize.ts
deleted file mode 100644
index 382994e2d..000000000
--- a/src/server/downsize.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import * as fs from 'fs';
-import * as sharp from 'sharp';
-
-const folder = "./src/server/public/files/";
-const pngTypes = ["png", "PNG"];
-const jpgTypes = ["jpg", "JPG", "jpeg", "JPEG"];
-const smallResizer = sharp().resize(100);
-fs.readdir(folder, async (err, files) => {
- if (err) {
- console.log("readdir:" + err);
- return;
- }
- // files.forEach(file => {
- // if (file.includes("_s") || file.includes("_m") || file.includes("_l")) {
- // fs.unlink(folder + file, () => { });
- // }
- // });
- for (const file of files) {
- const filesplit = file.split(".");
- const resizers = [
- { resizer: sharp().resize(100, undefined, { withoutEnlargement: true }), suffix: "_s" },
- { resizer: sharp().resize(400, undefined, { withoutEnlargement: true }), suffix: "_m" },
- { resizer: sharp().resize(900, undefined, { withoutEnlargement: true }), suffix: "_l" },
- ];
- if (pngTypes.some(type => file.endsWith(type))) {
- resizers.forEach(element => {
- element.resizer = element.resizer.png();
- });
- } else if (jpgTypes.some(type => file.endsWith(type))) {
- resizers.forEach(element => {
- element.resizer = element.resizer.jpeg();
- });
- } else {
- continue;
- }
- resizers.forEach(resizer => {
- fs.createReadStream(folder + file).pipe(resizer.resizer).pipe(fs.createWriteStream(folder + filesplit[0] + resizer.suffix + "." + filesplit[1]));
- });
- }
-}); \ No newline at end of file