diff --git a/ajax/get_photo.php b/ajax/get_photo.php new file mode 100644 index 0000000..5282c4c --- /dev/null +++ b/ajax/get_photo.php @@ -0,0 +1,72 @@ + 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { $i--; $j--; } +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +if (!$res && file_exists("../../main.inc.php")) $res = @include "../../main.inc.php"; +if (!$res && file_exists("../../../main.inc.php")) $res = @include "../../../main.inc.php"; +if (!$res) die("Include of main fails"); + +require_once __DIR__.'/../class/upload_token.class.php'; + +// Token validieren +$token = (string) ($_REQUEST['token'] ?? ''); +$tok = BerichtUploadToken::fetchValid($db, $token); + +if (!$tok) { + http_response_code(403); + die('Token ungültig'); +} + +// Dateiname validieren (keine Pfad-Traversal erlauben) +$filename = basename((string) ($_REQUEST['file'] ?? '')); +if (empty($filename)) { + http_response_code(400); + die('Dateiname fehlt'); +} + +// Upload-Ordner ermitteln +$upload_dir = $tok->getUploadDir(); +if (!$upload_dir) { + http_response_code(404); + die('Ordner nicht gefunden'); +} + +$filepath = $upload_dir . '/' . $filename; + +// Prüfen ob Datei existiert und im erlaubten Ordner liegt +$realpath = realpath($filepath); +$realdir = realpath($upload_dir); + +if (!$realpath || !$realdir || strpos($realpath, $realdir) !== 0) { + http_response_code(404); + die('Datei nicht gefunden'); +} + +// Datei ausliefern +$mime = mime_content_type($realpath); +if (!$mime || strpos($mime, 'image') !== 0) { + $mime = 'application/octet-stream'; +} + +header('Content-Type: ' . $mime); +header('Content-Length: ' . filesize($realpath)); +header('Cache-Control: private, max-age=3600'); + +readfile($realpath); +exit; diff --git a/ajax/list_photos.php b/ajax/list_photos.php new file mode 100644 index 0000000..71a3fc2 --- /dev/null +++ b/ajax/list_photos.php @@ -0,0 +1,67 @@ + 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { $i--; $j--; } +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +if (!$res && file_exists("../../main.inc.php")) $res = @include "../../main.inc.php"; +if (!$res && file_exists("../../../main.inc.php")) $res = @include "../../../main.inc.php"; +if (!$res) die("Include of main fails"); + +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once __DIR__.'/../class/upload_token.class.php'; + +header('Content-Type: application/json; charset=utf-8'); + +// Token validieren +$token = (string) ($_REQUEST['token'] ?? ''); +$tok = BerichtUploadToken::fetchValid($db, $token); + +if (!$tok) { + http_response_code(403); + echo json_encode(array('success' => false, 'error' => 'Token ungültig oder abgelaufen')); + exit; +} + +// Upload-Ordner ermitteln +$upload_dir = $tok->getUploadDir(); +if (!$upload_dir || !is_dir($upload_dir)) { + echo json_encode(array('success' => true, 'photos' => array())); + exit; +} + +// Bilder auflisten +$files = dol_dir_list($upload_dir, 'files', 0, '\.(jpg|jpeg|png|gif)$', '', 'date', SORT_DESC); +$photos = array(); + +$base_url = dol_buildpath('/bericht/ajax/get_photo.php', 1); + +foreach ($files as $f) { + $photos[] = array( + 'filename' => $f['name'], + 'url' => $base_url . '?token=' . urlencode($token) . '&file=' . urlencode($f['name']), + 'size' => $f['size'], + 'date' => dol_print_date($f['date'], '%Y-%m-%d %H:%M'), + ); +} + +echo json_encode(array( + 'success' => true, + 'photos' => $photos, + 'count' => count($photos), +)); diff --git a/mobile_upload.php b/mobile_upload.php index 411ec93..00da223 100644 --- a/mobile_upload.php +++ b/mobile_upload.php @@ -631,6 +631,52 @@ body { .scanner-page-thumb { cursor: pointer; } + +/* ========== Foto-Galerie (vorhandene Bilder) ========== */ +.photo-gallery { + padding: 16px; + background: #222; + border-radius: 8px; + margin: 16px; +} +.photo-gallery h3 { + margin: 0 0 12px 0; + font-size: 14px; + color: #aaa; + font-weight: normal; +} +.photo-gallery-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); + gap: 8px; +} +.photo-gallery-item { + aspect-ratio: 1; + border-radius: 6px; + overflow: hidden; + cursor: pointer; + background: #333; +} +.photo-gallery-item img { + width: 100%; + height: 100%; + object-fit: cover; +} +.photo-gallery-item:active { + opacity: 0.7; +} +.photo-gallery-empty { + color: #666; + font-size: 13px; + text-align: center; + padding: 20px; +} +.photo-gallery-loading { + color: #888; + font-size: 13px; + text-align: center; + padding: 20px; +}
@@ -650,6 +696,14 @@ body { + +