diff options
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/ApiManagers/UploadManager.ts | 58 | ||||
-rw-r--r-- | src/server/DashUploadUtils.ts | 29 |
2 files changed, 35 insertions, 52 deletions
diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts index 478f7da3d..83644e564 100644 --- a/src/server/ApiManagers/UploadManager.ts +++ b/src/server/ApiManagers/UploadManager.ts @@ -1,6 +1,6 @@ import * as formidable from 'formidable'; import { createReadStream, createWriteStream, unlink, writeFile } from 'fs'; -import { basename, dirname, extname, normalize } from 'path'; +import * as path from 'path'; import Jimp from 'jimp'; import { filesDirectory, publicDirectory } from '..'; import { retrocycle } from '../../decycler/decycler'; @@ -13,7 +13,6 @@ 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'); @@ -30,11 +29,11 @@ export enum Directory { } export function serverPathToFile(directory: Directory, filename: string) { - return normalize(`${filesDirectory}/${directory}/${filename}`); + return path.normalize(`${filesDirectory}/${directory}/${filename}`); } export function pathToDirectory(directory: Directory) { - return normalize(`${filesDirectory}/${directory}`); + return path.normalize(`${filesDirectory}/${directory}`); } export function clientPathToFile(directory: Directory, filename: string) { @@ -256,26 +255,20 @@ export default class UploadManager extends ApiManager { if (!entryName.startsWith('files/')) { return; } - const extension = extname(entryName); + const extension = path.extname(entryName); const pathname = publicDirectory + '/' + entry.entryName; const targetname = publicDirectory + '/' + entryName; try { zip.extractEntryTo(entry.entryName, publicDirectory, true, false); createReadStream(pathname).pipe(createWriteStream(targetname)); - 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, () => {}); + Jimp.read(pathname).then(img => { + DashUploadUtils.imageResampleSizes(extension).forEach(({ width, suffix }) => { + const outputPath = InjectSize(targetname, suffix); + if (!width) createReadStream(pathname).pipe(createWriteStream(outputPath)); + else img = img.resize(width, Jimp.AUTO).write(outputPath); + }); + unlink(pathname, () => {}); + }); } catch (e) { console.log(e); } @@ -347,23 +340,16 @@ export default class UploadManager extends ApiManager { .map((f: any) => fs.unlinkSync(path + f)); } return imageDataUri.outputFile(uri, serverPathToFile(Directory.images, InjectSize(filename, origSuffix))).then((savedName: string) => { - const ext = extname(savedName).toLowerCase(); - const { pngs, jpgs } = AcceptableMedia; - 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)) - ); - }); + const ext = path.extname(savedName).toLowerCase(); + if (AcceptableMedia.imageFormats.includes(ext)) { + Jimp.read(savedName).then(img => + (!origSuffix ? [{ width: 400, suffix: SizeSuffix.Medium }] : Object.values(DashUploadUtils.Sizes)) // + .forEach(({ width, suffix }) => { + const outputPath = InjectSize(filename, suffix); + if (!width) createReadStream(savedName).pipe(createWriteStream(outputPath)); + else img = img.resize(width, Jimp.AUTO).write(outputPath); + }) + ); } res.send(clientPathToFile(Directory.images, filename + ext)); }); diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts index b2616af1f..6cad49033 100644 --- a/src/server/DashUploadUtils.ts +++ b/src/server/DashUploadUtils.ts @@ -54,7 +54,7 @@ export namespace DashUploadUtils { } export const Sizes: { [size: string]: Size } = { - LARGE: { width: 900, suffix: SizeSuffix.Large }, + LARGE: { width: 800, suffix: SizeSuffix.Large }, MEDIUM: { width: 400, suffix: SizeSuffix.Medium }, SMALL: { width: 100, suffix: SizeSuffix.Small }, }; @@ -594,20 +594,17 @@ 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(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))) { + export function outputResizedImages(sourcePath: string, outputFileName: string, outputDirectory: string) { + const writtenFiles: { [suffix: string]: string } = {}; + return Jimp.read(sourcePath).then(async img => { + await Promise.all( + imageResampleSizes(path.extname(outputFileName)).map(({ width, suffix }) => { 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(); - }); - } - resolve(writtenFiles); - }); + if (!width) return new Promise<void>(res => createReadStream(sourcePath).pipe(createWriteStream(outputPath)).on('close', res)); + else img = img.resize(width, Jimp.AUTO).write(outputPath); + }) // prettier-ignore + ); + return writtenFiles; }); } @@ -616,10 +613,10 @@ export namespace DashUploadUtils { * @param ext the extension * @returns an array of resize descriptions */ - function resizers(ext: string): DashUploadUtils.ImageResizer[] { + export function imageResampleSizes(ext: string): DashUploadUtils.ImageResizer[] { return [ { suffix: SizeSuffix.Original }, - ...[...(AcceptableMedia.imageFormats.includes(ext) ? Object.values(DashUploadUtils.Sizes) : [])].map(({ suffix, width }) => ({ + ...[...(AcceptableMedia.imageFormats.includes(ext.toLowerCase()) ? Object.values(DashUploadUtils.Sizes) : [])].map(({ suffix, width }) => ({ width, suffix, })), |