From efd0032c81ee59966d6834632480e8fceac91bdc Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Thu, 2 Jan 2020 02:45:05 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=89=E3=83=A9=E3=82=A4=E3=83=96=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=ABURL=E7=94=9F=E6=88=90=E3=81=AA?= =?UTF-8?q?=E3=81=A9=E3=81=AE=E4=BF=AE=E6=AD=A3=20(#5671)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix: リモートプロキシ時にサムネイルのContent-Typeがおかしい * fix drive --- src/models/repositories/drive-file.ts | 20 ++++---------------- src/server/file/send-drive-file.ts | 2 +- src/services/drive/add-file.ts | 14 +------------- src/services/drive/delete-file.ts | 4 ++-- src/services/drive/image-processor.ts | 26 -------------------------- 5 files changed, 8 insertions(+), 58 deletions(-) diff --git a/src/models/repositories/drive-file.ts b/src/models/repositories/drive-file.ts index 5e3c1e94b..63b9f6096 100644 --- a/src/models/repositories/drive-file.ts +++ b/src/models/repositories/drive-file.ts @@ -39,25 +39,13 @@ export class DriveFileRepository extends Repository { const key = thumbnail ? file.thumbnailAccessKey : file.webpublicAccessKey; if (key && !key.match('/')) { // 古いものはここにオブジェクトストレージキーが入ってるので除外 - let ext = ''; - - if (file.name) { - [ext] = (file.name.match(/\.(\w+)$/) || ['']); - } - - if (ext === '') { - if (file.type === 'image/jpeg') ext = '.jpg'; - if (file.type === 'image/png') ext = '.png'; - if (file.type === 'image/webp') ext = '.webp'; - if (file.type === 'image/apng') ext = '.apng'; - if (file.type === 'image/vnd.mozilla.apng') ext = '.apng'; - } - - return `/files/${key}/${key}${ext}`; + return `/files/${key}`; } } - return thumbnail ? (file.thumbnailUrl || file.webpublicUrl || null) : (file.webpublicUrl || file.url); + const isImage = file.type && ['image/png', 'image/apng', 'image/gif', 'image/jpeg', 'image/webp', 'image/svg+xml'].includes(file.type); + + return thumbnail ? (file.thumbnailUrl || (isImage ? (file.webpublicUrl || file.url) : null)) : (file.webpublicUrl || file.url); } public async clacDriveUsageOf(user: User['id'] | User): Promise { diff --git a/src/server/file/send-drive-file.ts b/src/server/file/send-drive-file.ts index e0aea5b42..1a43e5dc4 100644 --- a/src/server/file/send-drive-file.ts +++ b/src/server/file/send-drive-file.ts @@ -78,7 +78,7 @@ export default async function(ctx: Koa.Context) { const image = await convertFile(); ctx.body = image.data; - ctx.set('Content-Type', file.type); + ctx.set('Content-Type', image.type); ctx.set('Cache-Control', 'max-age=31536000, immutable'); } catch (e) { serverLogger.error(e); diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 877075b8b..54aa018a4 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -10,7 +10,7 @@ import { deleteFile } from './delete-file'; import { fetchMeta } from '../../misc/fetch-meta'; import { GenerateVideoThumbnail } from './generate-video-thumbnail'; import { driveLogger } from './logger'; -import { IImage, convertToJpeg, convertToWebp, convertToPng, convertToGif, convertToApng } from './image-processor'; +import { IImage, convertToJpeg, convertToWebp, convertToPng } from './image-processor'; import { contentDisposition } from '../../misc/content-disposition'; import { detectMine } from '../../misc/detect-mine'; import { DriveFiles, DriveFolders, Users, Instances, UserProfiles } from '../../models'; @@ -159,12 +159,6 @@ export async function generateAlts(path: string, type: string, generateWeb: bool webpublic = await convertToWebp(path, 2048, 2048); } else if (['image/png'].includes(type)) { webpublic = await convertToPng(path, 2048, 2048); - } else if (['image/apng', 'image/vnd.mozilla.apng'].includes(type)) { - webpublic = await convertToApng(path); - } else if (['image/gif'].includes(type)) { - webpublic = await convertToGif(path); - } else { - logger.info(`web image not created (not an image)`); } } catch (e) { logger.warn(`web image not created (an error occured)`, e); @@ -182,10 +176,6 @@ export async function generateAlts(path: string, type: string, generateWeb: bool thumbnail = await convertToJpeg(path, 498, 280); } else if (['image/png'].includes(type)) { thumbnail = await convertToPng(path, 498, 280); - } else if (['image/gif'].includes(type)) { - thumbnail = await convertToGif(path); - } else if (['image/apng', 'image/vnd.mozilla.apng'].includes(type)) { - thumbnail = await convertToApng(path); } else if (type.startsWith('video/')) { try { thumbnail = await GenerateVideoThumbnail(path); @@ -422,8 +412,6 @@ export default async function( if (isLink) { file.url = url; - file.thumbnailUrl = url; - file.webpublicUrl = url; // ローカルプロキシ用 file.accessKey = uuid(); file.thumbnailAccessKey = 'thumbnail-' + uuid(); diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts index 18603617d..00252a6f4 100644 --- a/src/services/drive/delete-file.ts +++ b/src/services/drive/delete-file.ts @@ -69,8 +69,8 @@ function postProcess(file: DriveFile, isExpired = false) { DriveFiles.update(file.id, { isLink: true, url: file.uri, - thumbnailUrl: file.uri, - webpublicUrl: file.uri, + thumbnailUrl: null, + webpublicUrl: null, size: 0, // ローカルプロキシ用 accessKey: uuid(), diff --git a/src/services/drive/image-processor.ts b/src/services/drive/image-processor.ts index 4b8db0e0c..e2dd90cfa 100644 --- a/src/services/drive/image-processor.ts +++ b/src/services/drive/image-processor.ts @@ -74,29 +74,3 @@ export async function convertToPng(path: string, width: number, height: number): type: 'image/png' }; } - -/** - * Convert to GIF (Actually just NOP) - */ -export async function convertToGif(path: string): Promise { - const data = await fs.promises.readFile(path); - - return { - data, - ext: 'gif', - type: 'image/gif' - }; -} - -/** - * Convert to APNG (Actually just NOP) - */ -export async function convertToApng(path: string): Promise { - const data = await fs.promises.readFile(path); - - return { - data, - ext: 'apng', - type: 'image/apng' - }; -}