From d71b1ee052267752e2b80eab31686f41a3dfd317 Mon Sep 17 00:00:00 2001 From: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com> Date: Thu, 30 Nov 2023 13:11:03 +0530 Subject: [PATCH] fix: fixes encoding of file name (#1712) --- apps/web/app/api/internal/csv-conversion/route.ts | 10 +++++++++- apps/web/app/api/internal/excel-conversion/route.ts | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/web/app/api/internal/csv-conversion/route.ts b/apps/web/app/api/internal/csv-conversion/route.ts index dffc655fbf..b2c17dc3fc 100755 --- a/apps/web/app/api/internal/csv-conversion/route.ts +++ b/apps/web/app/api/internal/csv-conversion/route.ts @@ -16,6 +16,11 @@ export async function POST(request: NextRequest) { const { json, fields, fileName } = data; + const fallbackFileName = fileName.replace(/[^A-Za-z0-9_.-]/g, "_"); + const encodedFileName = encodeURIComponent(fileName) + .replace(/['()]/g, (match) => "%" + match.charCodeAt(0).toString(16)) + .replace(/\*/g, "%2A"); + const parser = new AsyncParser({ fields, }); @@ -29,7 +34,10 @@ export async function POST(request: NextRequest) { const headers = new Headers(); headers.set("Content-Type", "text/csv;charset=utf-8;"); - headers.set("Content-Disposition", `attachment; filename=${fileName ?? "converted"}.csv`); + headers.set( + "Content-Disposition", + `attachment; filename="${fallbackFileName}"; filename*=UTF-8''${encodedFileName}` + ); return NextResponse.json( { diff --git a/apps/web/app/api/internal/excel-conversion/route.ts b/apps/web/app/api/internal/excel-conversion/route.ts index 2dbd579cb3..e135baa7b5 100755 --- a/apps/web/app/api/internal/excel-conversion/route.ts +++ b/apps/web/app/api/internal/excel-conversion/route.ts @@ -15,6 +15,11 @@ export async function POST(request: NextRequest) { const { json, fields, fileName } = data; + const fallbackFileName = fileName.replace(/[^A-Za-z0-9_.-]/g, "_"); + const encodedFileName = encodeURIComponent(fileName) + .replace(/['()]/g, (match) => "%" + match.charCodeAt(0).toString(16)) + .replace(/\*/g, "%2A"); + const wb = xlsx.utils.book_new(); const ws = xlsx.utils.json_to_sheet(json, { header: fields }); xlsx.utils.book_append_sheet(wb, ws, "Sheet1"); @@ -23,8 +28,12 @@ export async function POST(request: NextRequest) { const base64String = buffer.toString("base64"); const headers = new Headers(); + headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); - headers.set("Content-Disposition", `attachment; filename=${fileName ?? "converted"}.xlsx`); + headers.set( + "Content-Disposition", + `attachment; filename="${fallbackFileName}"; filename*=UTF-8''${encodedFileName}` + ); return NextResponse.json( {