feat: enhance file download handling

Improved the file download process by appending filenames to the proxy URLs, facilitating proper naming of downloaded files. Updated the proxy function to accept an optional filename parameter, which is then used to set the 'Content-Disposition' header for file downloads. This ensures that files downloaded through the proxy are saved with their original names, improving user experience and file management. Additionally, modified the main route to pass file names to the proxy URLs for both image and non-image files, aligning with the enhanced proxy functionality.

This change addresses user feedback regarding difficulties in identifying and organizing downloaded files, by ensuring files retain their names post-download, thus making it easier for users to recognize and manage their downloads effectively.
This commit is contained in:
Kumi 2024-05-26 08:50:22 +02:00
parent ef1566d20b
commit 3812d675fc
Signed by: kumi
GPG key ID: ECBCC9082395383F
3 changed files with 16 additions and 6 deletions

View file

@ -157,13 +157,13 @@ def init_main_routes(app):
for file in step["files"]: for file in step["files"]:
if file["image"] and "embedType" not in "file": if file["image"] and "embedType" not in "file":
step_imgs.append( step_imgs.append(
{"src": proxy(file["downloadUrl"]), "alt": file["name"]} {"src": proxy(file["downloadUrl"], file["name"]), "alt": file["name"]}
) )
elif not file["image"]: elif not file["image"]:
step_downloads.append( step_downloads.append(
{ {
"src": proxy(file["downloadUrl"]), "src": proxy(file["downloadUrl"], file["name"]),
"name": file["name"], "name": file["name"],
} }
) )

View file

@ -4,10 +4,13 @@ from urllib.parse import unquote
from urllib.error import HTTPError from urllib.error import HTTPError
from urllib.request import urlopen from urllib.request import urlopen
def init_proxy_routes(app): def init_proxy_routes(app):
@app.route("/proxy/") @app.route("/proxy/")
def route_proxy(): def route_proxy():
url = request.args.get("url") url = request.args.get("url")
filename = request.args.get("filename")
if url is not None: if url is not None:
if url.startswith("https://cdn.instructables.com/") or url.startswith( if url.startswith("https://cdn.instructables.com/") or url.startswith(
"https://content.instructables.com/" "https://content.instructables.com/"
@ -34,7 +37,14 @@ def init_proxy_routes(app):
except KeyError: except KeyError:
raise InternalServerError() raise InternalServerError()
return Response(generate(), content_type=content_type) headers = dict()
if filename is not None:
headers["Content-Disposition"] = (
f'attachment; filename="{filename}"'
)
return Response(generate(), content_type=content_type, headers=headers)
else: else:
raise BadRequest() raise BadRequest()
else: else:

View file

@ -9,9 +9,9 @@ from flask import request, render_template, abort
logging.basicConfig(level=logging.DEBUG) logging.basicConfig(level=logging.DEBUG)
def proxy(url): def proxy(url, filename=None):
logging.debug(f"Generating proxy URL for {url}") logging.debug(f"Generating proxy URL for {url}")
return f"/proxy/?url={url}" return f"/proxy/?url={url}" + (f"&filename={filename}" if filename else "")
def get_typesense_api_key(): def get_typesense_api_key():