From 1c7a1949501973014dfa6efa79a9d33d1a292a7e Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 16 Aug 2018 06:27:35 +0900 Subject: [PATCH] wip --- src/services/drive/add-file.ts | 61 ++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 701d547776..277d628ac9 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -17,30 +17,52 @@ import { publishUserStream, publishDriveStream } from '../../stream'; import { isLocalUser, IUser, IRemoteUser } from '../../models/user'; import delFile from './delete-file'; import config from '../../config'; +import { getDriveFileThumbnailBucket } from '../../models/drive-file-thumbnail'; const log = debug('misskey:drive:add-file'); -async function save(readable: stream.Readable, name: string, type: string, hash: string, size: number, metadata: any): Promise { +async function save(path: string, name: string, type: string, hash: string, size: number, metadata: any): Promise { + let thumbnail: Buffer; + + if (['image/jpeg', 'image/png', 'image/webp'].includes(type)) { + thumbnail = await sharp(path) + .resize(500) + .jpeg({ + quality: 70, + progressive: true + }) + .toBuffer(); + } + if (config.drive && config.drive.storage == 'minio') { const minio = new Minio.Client(config.drive.config); const id = uuid.v4(); const obj = `${config.drive.prefix}/${id}`; + const thumbnailObj = `${obj}-thumbnail`; const baseUrl = config.drive.baseUrl || `${ config.drive.config.secure ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? ':' + config.drive.config.port : '' }/${ config.drive.bucket }`; - await minio.putObject(config.drive.bucket, obj, readable, size, { + await minio.putObject(config.drive.bucket, obj, fs.createReadStream(path), size, { 'Content-Type': type, 'Cache-Control': 'max-age=31536000, immutable' }); + if (thumbnail) { + await minio.putObject(config.drive.bucket, thumbnailObj, fs.createReadStream(path), size, { + 'Content-Type': 'image/jpeg', + 'Cache-Control': 'max-age=31536000, immutable' + }); + } + Object.assign(metadata, { withoutChunks: true, storage: 'minio', storageProps: { id: id }, - url: `${ baseUrl }/${ obj }` + url: `${ baseUrl }/${ obj }`, + thumbnailUrl: thumbnail ? `${ baseUrl }/${ thumbnailObj }` : null }); const file = await DriveFile.insert({ @@ -57,12 +79,37 @@ async function save(readable: stream.Readable, name: string, type: string, hash: // Get MongoDB GridFS bucket const bucket = await getDriveFileBucket(); - return new Promise((resolve, reject) => { - const writeStream = bucket.openUploadStream(name, { contentType: type, metadata }); + const file = await new Promise((resolve, reject) => { + const writeStream = bucket.openUploadStream(name, { + contentType: type, + metadata + }); + writeStream.once('finish', resolve); writeStream.on('error', reject); - readable.pipe(writeStream); + + fs.createReadStream(path).pipe(writeStream); }); + + if (thumbnail) { + const thumbnailBucket = await getDriveFileThumbnailBucket(); + + await new Promise((resolve, reject) => { + const writeStream = thumbnailBucket.openUploadStream(name, { + contentType: 'image/jpeg', + metadata: { + originalId: file._id + } + }); + + writeStream.once('finish', resolve); + writeStream.on('error', reject); + + fs.createReadStream(path).pipe(writeStream); + }); + } + + return file; } } @@ -321,7 +368,7 @@ export default async function( } } } else { - driveFile = await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata)); + driveFile = await (save(path, detectedName, mime, hash, size, metadata)); } log(`drive file has been created ${driveFile._id}`);