From 94e750a5f114bba06c709b655f3ada8524712874 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Mon, 11 Mar 2024 12:29:34 -0700 Subject: [PATCH] [REF-2157] Allow `rx.download` to resolve `rx.get_upload_url` links (#2813) --- reflex/.templates/web/utils/state.js | 3 ++- reflex/components/core/upload.py | 4 ++-- reflex/components/core/upload.pyi | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/reflex/.templates/web/utils/state.js b/reflex/.templates/web/utils/state.js index 51e8c6b8d..a46f55d68 100644 --- a/reflex/.templates/web/utils/state.js +++ b/reflex/.templates/web/utils/state.js @@ -161,7 +161,8 @@ export const applyEvent = async (event, socket) => { if (event.name == "_download") { const a = document.createElement("a"); a.hidden = true; - a.href = event.payload.url; + // Special case when linking to uploaded files + a.href = event.payload.url.replace("${getBackendURL(env.UPLOAD)}", getBackendURL(env.UPLOAD)) a.download = event.payload.filename; a.click(); a.remove(); diff --git a/reflex/components/core/upload.py b/reflex/components/core/upload.py index 0d8eaea03..a1f9df9d0 100644 --- a/reflex/components/core/upload.py +++ b/reflex/components/core/upload.py @@ -128,7 +128,7 @@ uploaded_files_url_prefix: Var = Var.create_safe( ) -def get_upload_url(file_path: str) -> str: +def get_upload_url(file_path: str) -> Var[str]: """Get the URL of an uploaded file. Args: @@ -139,7 +139,7 @@ def get_upload_url(file_path: str) -> str: """ Upload.is_used = True - return f"{uploaded_files_url_prefix}/{file_path}" + return Var.create_safe(f"{uploaded_files_url_prefix}/{file_path}") def _on_drop_spec(files: Var): diff --git a/reflex/components/core/upload.pyi b/reflex/components/core/upload.pyi index 8614c6617..bb246f69b 100644 --- a/reflex/components/core/upload.pyi +++ b/reflex/components/core/upload.pyi @@ -40,7 +40,7 @@ def get_upload_dir() -> Path: ... uploaded_files_url_prefix: Var -def get_upload_url(file_path: str) -> str: ... +def get_upload_url(file_path: str) -> Var[str]: ... class UploadFilesProvider(Component): @overload