Kleines Script - Bilderprüfung
Verfasst: 27 Jun 2026, 10:58
Hier ein kleines Script zum Wochenende.
Ich wünsche es Hilft euch bei Eurer Arbeit.
!!!!!!!! Benutzen wie immer auf eigene Gefahr !!!!!!
Anleitung – BildPrüfer verwenden
1. Script hochladen (geschützt)
Lade die PHP-Datei auf deinen Webserver hoch
Lege sie in ein passwortgeschütztes Verzeichnis (z. B. per .htaccess)
Rufe das Script im Browser auf (z. B. https://deine-domain.de/bildpruefer/)
Vorteil: Deine CSV- und Bilddaten sind geschützt
2. Bilder vorbereiten
Entpacke das Bild-ZIP des Herstellers
Lege die Bilder in einen Ordner auf dem Server ab
(z. B. /bildpruefer/hersteller1/)
Wichtig:
Die Bilder müssen physisch vorhanden sein
Unterordner sind erlaubt (werden automatisch durchsucht)
3. CSV-Datei vorbereiten
Deine CSV muss folgendes Format haben:
Spalte 1 = Artikelnummer
Spalte 2+ = Bildnamen
Beispiel:
A001;bild1.jpg;bild2.jpg;bild3.jpg
A002;bild4.jpg
A003;bild5.jpg;bild6.jpg
Wichtig:
Unterschiedliche Anzahl an Bildern pro Artikel ist erlaubt ✔
Leere Spalten sind egal ✔
Nur der Dateiname (inkl. Endung), kein Pfad
4. Prüfung starten
CSV-Datei auswählen
Bildordner auswählen
Auf „Prüfung starten“ klicken
5. Ergebnis verstehen
Nach der Prüfung siehst du:
Gesamt → Anzahl CSV-Zeilen
Vorhanden → Bilder existieren
Fehlend → Bilder fehlen im Ordner
6. Fehlende Bilder analysieren
Tabelle zeigt:
Artikelnummer
Fehlender Bildname
Extra:
Klick auf einen Wert = automatisch kopieren
Suchfeld = schnell filtern
7. CSV Export
Button „CSV exportieren“
Download enthält nur fehlende Bilder
Zweck des Scripts (dein Anwendungsfall)
Du nutzt das Script, um:
✔ Hersteller-CSV (z.B.s: Textilienhersteller) zu prüfen
✔ Entpackte Bildarchive zu vergleichen
✔ Sicherzustellen, dass alle Bildnamen existieren
✔ Fehler vor dem Import zu erkennen
Was verhindert wird
Fehlende Bilder im Gambio-Shop
Ergebnis
Du importierst nur:
korrekte Artikel
gültige Bildnamen
vollständige Bilddaten
Ich wünsche es Hilft euch bei Eurer Arbeit.
!!!!!!!! Benutzen wie immer auf eigene Gefahr !!!!!!
Lade die PHP-Datei auf deinen Webserver hoch
Lege sie in ein passwortgeschütztes Verzeichnis (z. B. per .htaccess)
Rufe das Script im Browser auf (z. B. https://deine-domain.de/bildpruefer/)
Entpacke das Bild-ZIP des Herstellers
Lege die Bilder in einen Ordner auf dem Server ab
(z. B. /bildpruefer/hersteller1/)
Die Bilder müssen physisch vorhanden sein
Unterordner sind erlaubt (werden automatisch durchsucht)
Deine CSV muss folgendes Format haben:
Spalte 1 = Artikelnummer
Spalte 2+ = Bildnamen
Beispiel:
A001;bild1.jpg;bild2.jpg;bild3.jpg
A002;bild4.jpg
A003;bild5.jpg;bild6.jpg
Unterschiedliche Anzahl an Bildern pro Artikel ist erlaubt ✔
Leere Spalten sind egal ✔
Nur der Dateiname (inkl. Endung), kein Pfad
CSV-Datei auswählen
Bildordner auswählen
Auf „Prüfung starten“ klicken
Nach der Prüfung siehst du:
Gesamt → Anzahl CSV-Zeilen
Vorhanden → Bilder existieren
Fehlend → Bilder fehlen im Ordner
Tabelle zeigt:
Artikelnummer
Fehlender Bildname
Klick auf einen Wert = automatisch kopieren
Suchfeld = schnell filtern
Button „CSV exportieren“
Download enthält nur fehlende Bilder
Du nutzt das Script, um:
✔ Hersteller-CSV (z.B.s: Textilienhersteller) zu prüfen
✔ Entpackte Bildarchive zu vergleichen
✔ Sicherzustellen, dass alle Bildnamen existieren
✔ Fehler vor dem Import zu erkennen
Fehlende Bilder im Gambio-Shop
Du importierst nur:
korrekte Artikel
gültige Bildnamen
vollständige Bilddaten
Code: Alles auswählen
<?php
/**********************************************************************
* BildPrüfer
* Version 1.0
* Juratex - by Peter Süßbier, 5711 Gyula
**********************************************************************/
session_start();
/**********************************************************************
* Einstellungen
**********************************************************************/
$bildBasisOrdner = __DIR__ . "/";
/**********************************************************************
* CSV Export
**********************************************************************/
if (isset($_GET["export"])) {
if (!isset($_SESSION["missing"])) {
exit("Keine Daten vorhanden.");
}
header("Content-Type: text/csv; charset=UTF-8");
header("Content-Disposition: attachment; filename=fehlende_bilder_" . date("Ymd_His") . ".csv");
// UTF-8 BOM für Excel
echo "\xEF\xBB\xBF";
$out = fopen("php://output", "w");
fputcsv(
$out,
["Artikelnummer", "Bilddatei"],
";"
);
foreach ($_SESSION["missing"] as $row) {
fputcsv(
$out,
[
$row["artikel"],
$row["bild"]
],
";"
);
}
fclose($out);
exit;
}
/**********************************************************************
* Trennzeichen erkennen (, ;)
**********************************************************************/
function detectDelimiter($file)
{
$handle = fopen($file, "r");
if (!$handle) {
return ";";
}
$line = fgets($handle);
fclose($handle);
$delimiter = ";";
$count = 0;
foreach ([";", ",", "\t"] as $d) {
$c = substr_count($line, $d);
if ($c > $count) {
$count = $c;
$delimiter = $d;
}
}
return $delimiter;
}
/**********************************************************************
* CSV lesen (Erkennt wieviel Spalten die CSV hat)
**********************************************************************/
function readCsv($file)
{
$rows = [];
if (!file_exists($file)) {
return $rows;
}
$delimiter = detectDelimiter($file);
if (($handle = fopen($file, "r")) === false) {
return $rows;
}
while (($data = fgetcsv($handle, 0, $delimiter)) !== false) {
// Mindestens Artikelnummer muss vorhanden sein
if (!isset($data[0])) {
continue;
}
$artikel = trim($data[0]);
if ($artikel === "") {
continue;
}
$bilder = [];
// Alle weiteren Spalten prüfen (egal wie viele)
for ($i = 1; $i < count($data); $i++) {
// Falls Spalte nicht existiert → überspringen
if (!isset($data[$i])) {
continue;
}
$bild = trim($data[$i]);
// Leere Zellen ignorieren
if ($bild === "") {
continue;
}
$bilder[] = $bild;
}
// Auch Artikel ohne Bilder optional überspringen
if (!empty($bilder)) {
$rows[] = [
"artikel" => $artikel,
"bilder" => $bilder
];
}
}
fclose($handle);
return $rows;
}
/**********************************************************************
* Unterordner im Bilderverzeichnis suchen
**********************************************************************/
$ordner = [];
if (is_dir($bildBasisOrdner)) {
foreach (scandir($bildBasisOrdner) as $eintrag) {
if ($eintrag == "." || $eintrag == "..") {
continue;
}
if (is_dir($bildBasisOrdner . "/" . $eintrag)) {
$ordner[] = $eintrag;
}
}
sort($ordner);
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>BildPrüfer</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body{
background:#ececec;
}
.card{
margin-top:40px;
}
</style>
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="card shadow">
<div class="card-header">
<h3>BildPrüfer</h3>
</div>
<div class="card-body">
<form method="post"
enctype="multipart/form-data">
<div class="mb-3">
<label class="form-label">
CSV-Datei
</label>
<input
type="file"
name="csv"
accept=".csv"
class="form-control"
required>
</div>
<div class="mb-3">
<label class="form-label">
Bildordner
</label>
<select
name="bildordner"
class="form-select">
<?php foreach($ordner as $o): ?>
<option value="<?= htmlspecialchars($o) ?>">
<?= htmlspecialchars($o) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<button
class="btn btn-primary">
Prüfung starten
</button>
</form>
<hr>
<?php
/**********************************************************************
* CSV prüfen
**********************************************************************/
$missing = [];
$stats = null;
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!isset($_FILES["csv"]) || $_FILES["csv"]["error"] != UPLOAD_ERR_OK) {
echo '<div class="alert alert-danger">
Fehler beim Hochladen der CSV-Datei.
</div>';
} else {
// Temporäre CSV-Datei
$csvDatei = $_FILES["csv"]["tmp_name"];
// CSV einlesen
$daten = readCsv($csvDatei);
// Gewählten Bildordner bestimmen
$bildOrdner = $bildBasisOrdner . "/" . basename($_POST["bildordner"]);
// Alle vorhandenen Bilder einmal einlesen
$bilder = [];
if (is_dir($bildOrdner)) {
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$bildOrdner,
FilesystemIterator::SKIP_DOTS
)
);
foreach ($iterator as $datei) {
if ($datei->isFile()) {
$bilder[
strtolower($datei->getFilename())
] = true;
}
}
}
// CSV prüfen
foreach ($daten as $row) {
foreach ($row["bilder"] as $bild) {
$bildname = strtolower(trim($bild));
if (!isset($bilder[$bildname])) {
$missing[] = [
"artikel" => $row["artikel"],
"bild" => $bild
];
}
}
}
// Statistik
$stats = [
"gesamt" => count($daten),
"fehlend" => count($missing),
"vorhanden" => count($daten) - count($missing)
];
// Export vorbereiten
$_SESSION["missing"] = $missing;
}
}
/**********************************************************************
* Ausgabe Statistik
**********************************************************************/
if ($stats !== null) {
?>
<div class="row">
<div class="col-md-4">
<div class="alert alert-primary">
<strong>Gesamt</strong><br>
<?= number_format($stats["gesamt"],0,",",".") ?>
</div>
</div>
<div class="col-md-4">
<div class="alert alert-success">
<strong>Vorhanden</strong><br>
<?= number_format($stats["vorhanden"],0,",",".") ?>
</div>
</div>
<div class="col-md-4">
<div class="alert alert-danger">
<strong>Fehlend</strong><br>
<?= number_format($stats["fehlend"],0,",",".") ?>
</div>
</div>
</div>
<div class="mb-3">
<a
href="?export=1"
class="btn btn-success">
CSV exportieren
</a>
</div>
<?php
}
?>
<?php
/**********************************************************************
* Ausgabe der fehlenden Bilder
**********************************************************************/
?>
<?php if ($stats !== null): ?>
<hr>
<div class="d-flex justify-content-between align-items-center mb-3">
<h4>Fehlende Bilder</h4>
<input
type="text"
id="suche"
class="form-control"
placeholder="Suchen..."
style="width:300px;">
</div>
<?php if (count($missing) == 0): ?>
<div class="alert alert-success">
<strong>Fertig!</strong><br>
Alle Bilder aus der CSV wurden gefunden.
</div>
<?php else: ?>
<div class="table-responsive">
<table
class="table table-striped table-hover table-bordered"
id="ergebnis">
<thead class="table-dark">
<tr>
<th>Artikelnummer</th>
<th>Bilddatei</th>
</tr>
</thead>
<tbody>
<?php foreach($missing as $row): ?>
<tr>
<td class="copy-cell"
data-copy="<?= htmlspecialchars($row["artikel"]) ?>"
title="Klicken zum Kopieren">
<?= htmlspecialchars($row["artikel"]) ?>
</td>
<td class="copy-cell"
data-copy="<?= htmlspecialchars($row["bild"]) ?>"
title="Klicken zum Kopieren">
<?= htmlspecialchars($row["bild"]) ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="alert alert-warning">
Es fehlen
<strong><?= number_format(count($missing),0,",",".") ?></strong>
Bilddateien.
</div>
<?php endif; ?>
<?php endif; ?>
</div>
<div class="card-footer text-center">
BildPrüfer Version 1.0 von Peter Süßbier
</div>
</div>
</div>
</div>
</div>
<script>
const suche = document.getElementById("suche");
if(suche){
suche.addEventListener("keyup",function(){
let filter=this.value.toLowerCase();
let zeilen=document.querySelectorAll("#ergebnis tbody tr");
zeilen.forEach(function(z){
let text=z.innerText.toLowerCase();
if(text.indexOf(filter)>-1){
z.style.display="";
}
else{
z.style.display="none";
}
});
});
}
</script>
<script>
document.querySelectorAll(".copy-cell").forEach(function(cell){
cell.style.cursor = "pointer";
cell.addEventListener("click", function(){
let text = this.getAttribute("data-copy");
navigator.clipboard.writeText(text).then(() => {
let original = this.innerHTML;
this.innerHTML = "✔ Kopiert!";
setTimeout(() => {
this.innerHTML = original;
}, 1000);
}).catch(() => {
alert("Kopieren fehlgeschlagen");
});
});
});
</script>
</body>
</html>