

























@@ -329,6 +329,34 @@ function extensionForAuthoritativeHeaderMime(contentType?: string): string | und
329329return extensionForMime(mime);
330330}
331331332+function isGenericContainerMime(mime?: string): boolean {
333+return mime === "application/zip" || mime === "application/octet-stream";
334+}
335+336+function isImageHeaderMime(contentType?: string): boolean {
337+return normalizeOptionalString(contentType?.split(";")[0])?.startsWith("image/") === true;
338+}
339+340+function resolveSavedMediaExtension(params: {
341+detectedMime?: string;
342+headerExt?: string;
343+contentType?: string;
344+originalFilename?: string;
345+}): string {
346+const trustedHeaderExt =
347+params.headerExt &&
348+isGenericContainerMime(params.detectedMime) &&
349+isImageHeaderMime(params.contentType)
350+ ? undefined
351+ : params.headerExt;
352+return (
353+trustedHeaderExt ??
354+extensionForMime(params.detectedMime) ??
355+safeOriginalFilenameExtension(params.originalFilename) ??
356+""
357+);
358+}
359+332360function buildSavedMediaResult(params: {
333361dir: string;
334362id: string;
@@ -532,8 +560,12 @@ export async function saveMediaBuffer(
532560headerMime: contentType,
533561filePath: originalFilename ?? detectionFilePathHint,
534562});
535-const ext =
536-headerExt ?? extensionForMime(mime) ?? safeOriginalFilenameExtension(originalFilename) ?? "";
563+const ext = resolveSavedMediaExtension({
564+detectedMime: mime,
565+ headerExt,
566+ contentType,
567+ originalFilename,
568+});
537569const id = buildSavedMediaId({ baseId: uuid, ext, originalFilename });
538570await writeSavedMediaBuffer({ subdir, id, buffer });
539571return buildSavedMediaResult({ dir, id, size: buffer.byteLength, contentType: mime });
@@ -567,11 +599,12 @@ export async function saveMediaStream(
567599headerMime: contentType,
568600filePath: originalFilename ?? detectionFilePathHint,
569601});
570-const ext =
571-headerExt ??
572-extensionForMime(mime) ??
573-safeOriginalFilenameExtension(originalFilename) ??
574-"";
602+const ext = resolveSavedMediaExtension({
603+detectedMime: mime,
604+ headerExt,
605+ contentType,
606+ originalFilename,
607+});
575608const id = buildSavedMediaId({ baseId, ext, originalFilename });
576609return { id, size, contentType: mime };
577610},
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。