From 894fb505983bd0fdce640f0d29f3d29baf1d76b5 Mon Sep 17 00:00:00 2001 From: Vincent LAURENT Date: Tue, 23 Sep 2025 11:29:30 +0200 Subject: [PATCH] compress: using tmp filename and status code 204 when pdf is already optimized --- app.php | 24 +++++++++++++++--------- public/js/compress.js | 5 ++++- templates/compress.html.php | 3 +++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app.php b/app.php index ccc5630..e08fcab 100644 --- a/app.php +++ b/app.php @@ -442,16 +442,22 @@ $f3->route('GET /compress', $f3->route ('POST /compress', function($f3) { - $filename = null; - $tmpfile = tempnam($f3->get('UPLOADS'), 'pdfsignature_compress_'.uniqid("", true)); - unlink($tmpfile); - + $originalFilename = null; $files = Web::instance()->receive(function($file,$formFieldName) { if ($formFieldName == "pdf" && strpos(Web::instance()->mime($file['tmp_name'], true), 'application/pdf') !== 0) { $f3->error(403); } + }, false, function($fileBaseName, $formFieldName) use(&$originalFilename) { + $originalFilename = $fileBaseName; + return date("YmdHis")."_".uniqid()."_".md5($fileBaseName).'.pdf'; }); + if(!count($files)) { + http_response_code("500"); + header('Content-Type: text/plain'); + echo _("PDF compression failed"); + } + $compressionType = $f3->get('POST.compressionType'); if ($compressionType === 'medium') { $compressionType = '/ebook'; @@ -466,19 +472,19 @@ $f3->route ('POST /compress', $returnCode = shell_exec(sprintf("gs -sDEVICE=pdfwrite -dPDFSETTINGS=%s -dPassThroughJPEGImages=false -dPassThroughJPXImages=false -dAutoFilterGrayImages=false -dAutoFilterColorImages=false -dDetectDuplicateImages=true -dQUIET -dBATCH -o %s %s", $compressionType, $outputFileName, $filePath)); - if ($returnCode === false) { + if ($returnCode === false || !file_exists($outputFileName)) { http_response_code("500"); header('Content-Type: text/plain'); echo _("PDF compression failed"); return; } elseif (filesize($filePath) <= filesize($outputFileName)) { - http_response_code("500"); - header('Content-Type: text/plain'); - echo _("Your pdf is already optimized"); + http_response_code("204"); + unlink($outputFileName); + unlink($filePath); return; } else { header('Content-Type: application/pdf'); - header("Content-Disposition: attachment; filename=".basename($outputFileName)); + header("Content-Disposition: attachment; filename=".basename(str_replace(".pdf", "_compressed.pdf", $originalFilename))); readfile($outputFileName); } diff --git a/public/js/compress.js b/public/js/compress.js index 65d2b2a..fa771e7 100644 --- a/public/js/compress.js +++ b/public/js/compress.js @@ -36,7 +36,10 @@ document.addEventListener('DOMContentLoaded', function () { fetch(form.action, { method: form.method, body: formData }) .then(async function(response) { - if (response.ok) { + if (response.status == 204 ) { + document.querySelector('#error_message').classList.remove('d-none'); + document.querySelector('#error_message').innerText = trad["Your pdf is already optimized"]; + } else if (response.ok) { let filename = response.headers.get('content-disposition').replace('attachment; filename=', ''); let blob = await response.blob(); diff --git a/templates/compress.html.php b/templates/compress.html.php index 6079394..8deb2f9 100644 --- a/templates/compress.html.php +++ b/templates/compress.html.php @@ -51,6 +51,9 @@