diff options
| author | tamaina <tamaina@hotmail.co.jp> | 2023-03-04 16:51:07 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-04 16:51:07 +0900 |
| commit | 2d551a8598de12210ddb7f708561e51867ce3f10 (patch) | |
| tree | 59fea9e7a025693814b8e5e596dc2c43e6464034 /packages/backend/src/core/DownloadService.ts | |
| parent | fix(server): DriveFile related N+1 query when call note packMany (again) (#10... (diff) | |
| download | misskey-2d551a8598de12210ddb7f708561e51867ce3f10.tar.gz misskey-2d551a8598de12210ddb7f708561e51867ce3f10.tar.bz2 misskey-2d551a8598de12210ddb7f708561e51867ce3f10.zip | |
enhance(server): downloadUrlでContent-Dispositionからファイル名を取得 (#10150)
* enhance(server): downloadUrlでContent-Dispositionからファイル名を取得
Resolve #10036
Resolve #4750
* untitled
* オブジェクトストレージのContent-Dispositionのファイル名の拡張子をContent-Typeに添ったものにする
* :v:
* tiff
* fix filename
* add test
* /files/でもContent-Disposition
* comment
* fix test
Diffstat (limited to 'packages/backend/src/core/DownloadService.ts')
| -rw-r--r-- | packages/backend/src/core/DownloadService.ts | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/packages/backend/src/core/DownloadService.ts b/packages/backend/src/core/DownloadService.ts index 852c1f32e3..bd999c67da 100644 --- a/packages/backend/src/core/DownloadService.ts +++ b/packages/backend/src/core/DownloadService.ts @@ -6,6 +6,7 @@ import IPCIDR from 'ip-cidr'; import PrivateIp from 'private-ip'; import chalk from 'chalk'; import got, * as Got from 'got'; +import { parse } from 'content-disposition'; import { DI } from '@/di-symbols.js'; import type { Config } from '@/config.js'; import { HttpRequestService } from '@/core/HttpRequestService.js'; @@ -32,13 +33,18 @@ export class DownloadService { } @bindThis - public async downloadUrl(url: string, path: string): Promise<void> { + public async downloadUrl(url: string, path: string): Promise<{ + filename: string; + }> { this.logger.info(`Downloading ${chalk.cyan(url)} to ${chalk.cyanBright(path)} ...`); const timeout = 30 * 1000; const operationTimeout = 60 * 1000; const maxSize = this.config.maxFileSize ?? 262144000; + const urlObj = new URL(url); + let filename = urlObj.pathname.split('/').pop() ?? 'untitled'; + const req = got.stream(url, { headers: { 'User-Agent': this.config.userAgent, @@ -77,6 +83,14 @@ export class DownloadService { req.destroy(); } } + + const contentDisposition = res.headers['content-disposition']; + if (contentDisposition != null) { + const parsed = parse(contentDisposition); + if (parsed.parameters.filename) { + filename = parsed.parameters.filename; + } + } }).on('downloadProgress', (progress: Got.Progress) => { if (progress.transferred > maxSize) { this.logger.warn(`maxSize exceeded (${progress.transferred} > ${maxSize}) on downloadProgress`); @@ -95,6 +109,10 @@ export class DownloadService { } this.logger.succ(`Download finished: ${chalk.cyan(url)}`); + + return { + filename, + }; } @bindThis |