From b58d6f94570badfdec0e352c7f1fafffa4d2b896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20B=C3=A4ck?= Date: Fri, 8 Sep 2023 16:12:15 +0300 Subject: [PATCH] Allow downloading files with non-standard names --- package.json | 1 + pages/api/drive/private/download.ts | 6 ++---- pages/api/drive/public/download.ts | 8 +++----- yarn.lock | 9 ++++++++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 6fe11e2..c9bfd0e 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@fullcalendar/react": "^6.1.8", "@types/gapi": "^0.0.44", "classnames": "^2.3.1", + "content-disposition": "^0.5.4", "framer-motion": "^10.13.0", "googleapis": "105", "marked": "^8.0.0", diff --git a/pages/api/drive/private/download.ts b/pages/api/drive/private/download.ts index 5bea870..4cb14d5 100644 --- a/pages/api/drive/private/download.ts +++ b/pages/api/drive/private/download.ts @@ -1,6 +1,7 @@ import { NextApiRequest, NextApiResponse } from 'next' import { getDriveInstance, getDriveFile } from '@lib/api/driveFiles' import requireAuthMiddleware from '@middleware/checkAuth' +import contentDisposition from 'content-disposition' const drive = getDriveInstance(process.env.GOOGLE_PRIVATE_CREDS) @@ -9,10 +10,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => { const { fileId, fileName } = req.query const stream = await getDriveFile(fileId, drive) - res.setHeader( - 'content-disposition', - `attachment; filename="${fileName || fileId}"` - ) + res.setHeader('content-disposition', contentDisposition(fileName || fileId)) stream.pipe(res) } catch (error) { console.error('Error downloading file', error) diff --git a/pages/api/drive/public/download.ts b/pages/api/drive/public/download.ts index 97b91fb..5c5a885 100644 --- a/pages/api/drive/public/download.ts +++ b/pages/api/drive/public/download.ts @@ -1,5 +1,6 @@ import { NextApiRequest, NextApiResponse } from 'next' import { getDriveInstance, getDriveFile } from '@lib/api/driveFiles' +import contentDisposition from 'content-disposition' const drive = getDriveInstance() @@ -7,11 +8,8 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => { try { const { fileId, fileName } = req.query const stream = await getDriveFile(fileId, drive) - - res.setHeader( - 'content-disposition', - `attachment; filename="${fileName || fileId}"` - ) + console.log(contentDisposition(fileName)) + res.setHeader('content-disposition', contentDisposition(fileName || fileId)) stream.pipe(res) } catch (error) { console.error('Error downloading file', error) diff --git a/yarn.lock b/yarn.lock index 55a695f..02043b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -793,6 +793,13 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +content-disposition@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + cookie@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" @@ -2772,7 +2779,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==