ZIP Ordner mit Uploads erstellen aus einer bestimmten User ID

DaveThuet

Erfahrenes Mitglied
Guten Morgen

ich hätte da eine Frage...

Ich möchte für einen bestimmten User (user_id) alle seine Upload auslesen gemäss tbl_uploads und gemäss der Zeile id_uploads. Die Bilder liegen im Ordner "wallpaper" auf dem Root und in der tbl_ulpoads als Zeile "bildpfad". Ideal wäre es wenn es direkt mit allen Bildern des User einen Zip-Ordner macht im Ordner "wallpaper", damit es der User dann herunterladen kann. Die Originalbilder müssen aber im Ordner bleiben, also nur eine ZIP-Datei mit kopien seiner Uploads. Ich hoffe Ihr versteht mein Vorhaben.

Soweit komme ich habe aber keinen Plan wie es weiter gehen soll um eben eine ZIP-File zu kreieren...
PHP:
<?php

//TODO: User-ID setzen
$uid = 0000;
$limitPerRun = 30000;

//TODO: Connect the DB anpassen
mysql_connect('xyz', 'xyz', 'xyz');
mysql_select_db('xyz');

echo "<h1>Dateien von User {$uid}</h1>";
echo "<p>Die id kann im Script auf Zeile 4 angepasst werden. Aktuelle User-ID: {$uid}</p>";

/**
 * id_uploads    -> Die eigentliche Bild-ID
 * user_id         -> 0000 ist die ID des Users
 * bildpfad 
 */
$sql = "SELECT bildpfad FROM tbl_uploads WHERE id_user={$uid} ORDER BY id_uploads LIMIT {$limitPerRun};";

?>

Ich wäre Euch allen sehr dankbar für rasche Hilfe, da der User seine Bilder verloren hat (auf seine Festplatte) und mich nun nach den bereits Hochgeladenen nachfragt. Wären es einige Bilder würde ich dies Manuell machen aber dies ist ein User mit mehr als 24'000 Bildern und diese Domain hat insgesamt fast 60'000 Bildern also zuviel um es manuell zu suchen und Zippen.
 
Hat die Domain Shell-Zugriff (z.B. über SSH)? Dann könntest du das über Command-Line erledigen. Denn wie alxy schon schrieb, wird das komprimieren von 24k Bildern einige Zeit in Anspruch nehmen und sehr wahrscheinlich den Server in die Knie zwingen. Also Script schreiben, was über Kommandozeile arbeiten kann und dem mit nice(1) die Prio runter setzen.

Möglicherweise willst du mal lzma versuchen: http://forums.modem-help.co.uk/viewtopic.php?t=707&postdays=0&postorder=asc&start=15
 
Danke bereits für die zwei Antworten...
Ich Sehe mein Vorhaben ist in diesem Falle nicht ganz so einfach wie Gedacht. :(
Wie wäre es wenn man den Limiter auf 1000 setzen würde? ($limitPerRun)
Es würde dann Theoretisch ja einfach dann 24 ZIP-Dateien im Root liegen.
Wäre dies mit einem PHP-Code realisierbar?
 
Prinzipiell ist (so gut wie) alles mit PHP-Code erreichbar. Die Frage ist, was es dich an Aufwand kosten soll und wie robust das laufen muss.

Da es sich anscheinend um eine einmale Anfrage handelt, würde ich da nicht viel Einsatz reinstecken.

Dein Script ist schon ganz gut im Ansatz. Es fehlt eigentlich nur die Möglichkeit, ab einem bestimmten Datensatz zu beginnen (LIMIT erweitern) und die Komprimierfunktionalität.

Ich hab mal was gezaubert, was evtl. mit kleineren Abänderungen funktionieren könnte:

PHP:
<?php
//TODO: User-ID setzen
$uid = 0000;
$limitPerRun = 30000;

//TODO: Connect the DB anpassen
mysql_connect('xyz', 'xyz', 'xyz');
mysql_select_db('xyz');

/*
echo "<h1>Dateien von User {$uid}</h1>";
echo "<p>Die id kann im Script auf Zeile 4 angepasst werden. Aktuelle User-ID: {$uid}</p>";
*/

/**
 * id_uploads    -> Die eigentliche Bild-ID
 * user_id         -> 0000 ist die ID des Users
 * bildpfad 
 */
$start_id = 0;
if(isset($_GET['start_id']))
	$start_id = intval($_GET['start_id']);
$sql = "SELECT bildpfad,id_uploads FROM tbl_uploads WHERE id_user={$uid} AND id_uploads > {$start_id} ORDER BY id_uploads LIMIT {$limitPerRun};";

$zip = new ZipArchive();
$zip->open('bilder.' . time() . '.zip');

/* Sende query und hole result */
$result = mysql_query($sql) or die(mysql_error());
/* Über die Ergebnisse laufen */
$new_start_id = 0;
while($row = mysql_fetch_array($row))
{
	/* Bild hinzufügen */
	$zip->addFile($row['bildpfad']);
	/* Aktuell gelesene ID auslesen und merken */
	$new_start_id = $row['id_uploads'];
}
/* Zip speichern und schließen */
$zip->close();

/* Mein Script-Dateiname */
$my_script_name = __FILE__;

/* HTML-Ausgabe mit JS zum automatischen weiterleiten... */
echo <<<EOT
<html>
	<head>
		<title>Irgendein cooler Titel</title>
	</head>
	<body onload="document.location.href={$my_script_name}?start_id={$new_start_id};">
	</body>
</html>
EOT;
?>

Wenn die limitsPerRun zu hoch sind, musst du es mit kleineren Werten noch mal versuchen. Wird auf Try-and-Error hinauslaufen.
 
Zuletzt bearbeitet:
LIMIT und OFFSET sind die nativen MySQL Funktionen dafür :p

Wichtig ist, ob du die max_execution_time in der php.ini verändern kannst? Ansonsten sind 1000 Bilder schätzungsweise viel zu hoch angesetzt (habe leider keine Ahnung, wie schnell das so funktioniert).
 
Ich kenne die LIMIT-Klausel, denke aber, das mit einer zusätzlichen WHERE auf den Primärschlüssel ein performanterer Query ensteht, bei dem keine temporäre Tabelle erzeugt werden muss.
 
Guten Abend,

irgendwie erhalte ich 2 Fehler-Meldungen?
Kannst du mir da zur Lösung weiterhelfen?
Die Fehler-Meldungen:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/wallpaper/httpdocs/UserWallpapers.php on line 33

Warning: ZipArchive::close() [ziparchive.close]: Invalid or unitialized Zip object in /var/www/vhosts/wallpaper/httpdocs/UserWallpapers.php on line 41
 
while($row = mysql_fetch_array($row)) das ist falsch.

while($row = mysql_fetch_array($result))

Damit sollte sichd er andere Fehler von selbst erledigen. Aber mal ehrlich, das ist einfachstes debuggen...
 

Neue Beiträge

Zurück