enhance(frontend): サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように

This commit is contained in:
syuilo 2024-08-23 16:40:11 +09:00
parent 2f009f7d49
commit 8032a4e12a
8 changed files with 21 additions and 5 deletions

View file

@ -4,7 +4,7 @@
- -
### Client ### Client
- - サイズ制限を超過するファイルをアップロードしようとした際にエラーを出すように
### Server ### Server
- ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正 - ファイルがサイズの制限を超えてアップロードされた際にエラーを返さなかった問題を修正

View file

@ -133,7 +133,7 @@ export type Config = {
proxySmtp: string | undefined; proxySmtp: string | undefined;
proxyBypassHosts: string[] | undefined; proxyBypassHosts: string[] | undefined;
allowedPrivateNetworks: string[] | undefined; allowedPrivateNetworks: string[] | undefined;
maxFileSize: number | undefined; maxFileSize: number;
clusterLimit: number | undefined; clusterLimit: number | undefined;
id: string; id: string;
outgoingAddress: string | undefined; outgoingAddress: string | undefined;
@ -250,7 +250,7 @@ export function loadConfig(): Config {
proxySmtp: config.proxySmtp, proxySmtp: config.proxySmtp,
proxyBypassHosts: config.proxyBypassHosts, proxyBypassHosts: config.proxyBypassHosts,
allowedPrivateNetworks: config.allowedPrivateNetworks, allowedPrivateNetworks: config.allowedPrivateNetworks,
maxFileSize: config.maxFileSize, maxFileSize: config.maxFileSize ?? 262144000,
clusterLimit: config.clusterLimit, clusterLimit: config.clusterLimit,
outgoingAddress: config.outgoingAddress, outgoingAddress: config.outgoingAddress,
outgoingAddressFamily: config.outgoingAddressFamily, outgoingAddressFamily: config.outgoingAddressFamily,

View file

@ -42,7 +42,7 @@ export class DownloadService {
const timeout = 30 * 1000; const timeout = 30 * 1000;
const operationTimeout = 60 * 1000; const operationTimeout = 60 * 1000;
const maxSize = this.config.maxFileSize ?? 262144000; const maxSize = this.config.maxFileSize;
const urlObj = new URL(url); const urlObj = new URL(url);
let filename = urlObj.pathname.split('/').pop() ?? 'untitled'; let filename = urlObj.pathname.split('/').pop() ?? 'untitled';

View file

@ -129,6 +129,7 @@ export class MetaEntityService {
mediaProxy: this.config.mediaProxy, mediaProxy: this.config.mediaProxy,
enableUrlPreview: instance.urlPreviewEnabled, enableUrlPreview: instance.urlPreviewEnabled,
noteSearchableScope: (this.config.meilisearch == null || this.config.meilisearch.scope !== 'local') ? 'global' : 'local', noteSearchableScope: (this.config.meilisearch == null || this.config.meilisearch.scope !== 'local') ? 'global' : 'local',
maxFileSize: this.config.maxFileSize,
}; };
return packed; return packed;

View file

@ -253,6 +253,10 @@ export const packedMetaLiteSchema = {
optional: false, nullable: false, optional: false, nullable: false,
default: 'local', default: 'local',
}, },
maxFileSize: {
type: 'number',
optional: false, nullable: false,
},
}, },
} as const; } as const;

View file

@ -49,7 +49,7 @@ export class ApiServerService {
fastify.register(multipart, { fastify.register(multipart, {
limits: { limits: {
fileSize: this.config.maxFileSize ?? 262144000, fileSize: this.config.maxFileSize,
files: 1, files: 1,
}, },
}); });

View file

@ -13,6 +13,7 @@ import { apiUrl } from '@/config.js';
import { $i } from '@/account.js'; import { $i } from '@/account.js';
import { alert } from '@/os.js'; import { alert } from '@/os.js';
import { i18n } from '@/i18n.js'; import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
type Uploading = { type Uploading = {
id: string; id: string;
@ -39,6 +40,15 @@ export function uploadFile(
if (folder && typeof folder === 'object') folder = folder.id; if (folder && typeof folder === 'object') folder = folder.id;
if (file.size > instance.maxFileSize) {
alert({
type: 'error',
title: i18n.ts.failedToUpload,
text: i18n.ts.cannotUploadBecauseExceedsFileSizeLimit,
});
return Promise.reject();
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const id = uuid(); const id = uuid();

View file

@ -4947,6 +4947,7 @@ export type components = {
* @enum {string} * @enum {string}
*/ */
noteSearchableScope: 'local' | 'global'; noteSearchableScope: 'local' | 'global';
maxFileSize: number;
}; };
MetaDetailedOnly: { MetaDetailedOnly: {
features?: { features?: {