fix(results): encode download filenames (#587)

This commit is contained in:
桌子潔 2026-08-04 03:21:08 +08:00 committed by GitHub
parent 7157d2398e
commit 15e4046c19
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 2 deletions

View File

@ -0,0 +1,3 @@
export function buildDownloadUrl(webroot: string, outputPath: string, fileName: string): string {
return `${webroot}/download/${outputPath}${encodeURIComponent(fileName)}`;
}

View File

@ -3,6 +3,7 @@ import { BaseHtml } from "../components/base";
import { Header } from "../components/header";
import db from "../db/db";
import { Filename, Jobs } from "../db/types";
import { buildDownloadUrl } from "../helpers/buildDownloadUrl";
import { ALLOW_UNAUTHENTICATED, WEBROOT } from "../helpers/env";
import { DownloadIcon } from "../icons/download";
import { DeleteIcon } from "../icons/delete";
@ -107,7 +108,7 @@ function ResultsArticle({
text-accent-500 underline
hover:text-accent-400
`}
href={`${WEBROOT}/download/${outputPath}${file.output_file_name}`}
href={buildDownloadUrl(WEBROOT, outputPath, file.output_file_name)}
>
<EyeIcon />
</a>
@ -116,7 +117,7 @@ function ResultsArticle({
text-accent-500 underline
hover:text-accent-400
`}
href={`${WEBROOT}/download/${outputPath}${file.output_file_name}`}
href={buildDownloadUrl(WEBROOT, outputPath, file.output_file_name)}
download={file.output_file_name}
>
<DownloadIcon />

View File

@ -0,0 +1,12 @@
import { expect, test } from "bun:test";
import { buildDownloadUrl } from "../../src/helpers/buildDownloadUrl";
test("encodes reserved characters in download filenames", () => {
expect(buildDownloadUrl("", "1/2/", "clip #1?.gif")).toBe("/download/1/2/clip%20%231%3F.gif");
});
test("preserves output path segments while encoding the filename", () => {
expect(buildDownloadUrl("/convertx", "user/job/", "報告 100%.pdf")).toBe(
"/convertx/download/user/job/%E5%A0%B1%E5%91%8A%20100%25.pdf",
);
});