diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/dnn-action-download-item.tsx b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/dnn-action-download-item.tsx index e77ebe2b38d..deee0b7144e 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/dnn-action-download-item.tsx +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/actions/dnn-action-download-item/dnn-action-download-item.tsx @@ -18,7 +18,7 @@ export class DnnActionDownloadItem { } private handleClick(): void { - this.itemsClient.download(this.item.itemId, true); + this.itemsClient.download(this.item.itemId, false); } render() { diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts index 07007b4af50..87b2c8dbd7d 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/services/ItemsClient.ts @@ -171,6 +171,7 @@ export class ItemsClient{ .then(response => { if (response.status == 200) { var filename = response.headers.get("Content-Disposition").split("filename=")[1]; + filename = this.decodeRFC5987ContentDisposition(filename); response.blob().then(blob => { var oldDownloadLink = document.querySelector("#downloadLink"); if (oldDownloadLink) { @@ -189,6 +190,20 @@ export class ItemsClient{ .catch(error => reject(error)); }); } + private decodeRFC5987ContentDisposition(filename: string): string { + filename = filename.replace(/(^")|("$)/g, ''); + + if (filename.startsWith("=?utf-8?B?") && filename.endsWith("?=")) { + const encoded = filename.slice(10, -2); + return decodeURIComponent( + atob(encoded) + .split('') + .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)) + .join('') + ); + } + return filename; + } public search( folderId: number, @@ -741,3 +756,4 @@ export interface DeleteFolderRequest{ export interface DeleteFileRequest{ FileId: number; } +