From 6aad986d78e37cc2d5e4d82e17bbde4a00c6fbc5 Mon Sep 17 00:00:00 2001 From: Stefan Hacker Date: Sun, 12 Apr 2026 09:55:40 +0200 Subject: [PATCH] fix: PDFs im Preview-iframe statt neuem Tab Download-Endpoint unterstuetzt jetzt ?inline=1, wodurch Content-Disposition auf inline statt attachment gesetzt wird. PDF- und Bild-Preview nutzen diesen Parameter, damit der Browser das PDF im Preview-Iframe rendert statt einen Download auszuloesen. Normale Download-Buttons bleiben unveraendert. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/app/api/files.py | 7 +++++-- frontend/src/views/PreviewView.vue | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/app/api/files.py b/backend/app/api/files.py index a074615..da64e07 100644 --- a/backend/app/api/files.py +++ b/backend/app/api/files.py @@ -283,8 +283,11 @@ def download_file(file_id): if not filepath.exists(): return jsonify({'error': 'Datei auf Datentraeger nicht gefunden'}), 404 - return send_file(str(filepath), mimetype=f.mime_type, as_attachment=True, - download_name=f.name) + # inline=1 renders the file in-browser (used by PDF/image previews). + # Default is attachment so normal download buttons still save to disk. + inline = request.args.get('inline', '0') == '1' + return send_file(str(filepath), mimetype=f.mime_type, + as_attachment=not inline, download_name=f.name) def _download_folder_as_zip(folder): diff --git a/frontend/src/views/PreviewView.vue b/frontend/src/views/PreviewView.vue index 0f7005a..6f01f11 100644 --- a/frontend/src/views/PreviewView.vue +++ b/frontend/src/views/PreviewView.vue @@ -157,7 +157,7 @@ async function loadPreview() { previewType.value = data.type if (data.type === 'pdf' || data.type === 'image') { - previewUrl.value = getTokenUrl(`/api/files/${fileId}/download`) + previewUrl.value = getTokenUrl(`/api/files/${fileId}/download?inline=1`) canEdit.value = false } else if (data.type === 'html') { htmlContent.value = data.content