PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Apache: bei Download ZIP updaten



Roaster20
15.05.02, 12:16
Hallo Kollegen,

da ich meine Downloads verfolgen will, will ich folgendes realisieren.

Meine Downloads sind in der Apache Config gesichert. Das heißt, jeder Downloader muß sich mit Namen anmelden. Es können ZIPs runtergeladen werden. Ich will nun, daß eine Datei mit dem Namen des Downloaders VOR (!) dem Downloaden in die betreffende ZIP Datei kopiert wird. :D

Ich habe leider keinen blassen Schimmer, wie ich das realisieren soll noch konnte ich im Internet etwas dazu finden. Vielleicht fehlen mir einfach gescheite Suchworte.
PHP 4 ist auch installiert, falls es die ganze Sache vereinfacht :confused:

Grüsse
Martin

Duke
15.05.02, 12:56
ICh glaube nicht, dass so man so ohne weiteres einfach was in ne ZIP Datei packen kann also ohne, dass man selber was macht vielleicht geht sowas mit tar archiven aber ob dir das hilft

bernie
15.05.02, 13:37
Hi,

Da wirst du wohl ein bisschen programmieren müssen. PHP sollt dafür aber reichen. Wenn ich dich richtig verstanden hab hast du dateien die alle zusammen in ein ZIP mit dem Namen des Downloaders wandern sollen, stimmt das?

Mit PHP kannst du Systemkommandos absetzen. geht mit system() glaub ich, bin aber nicht sicher. und den Namen des Downloaders bekommst du vom Apache über Umgebungsvariablen. schau dir mal die ausgabe von phpinfo() an. Da sind die ganzen Variablen aufgelistet.

ahja, und gzip gibts für Linux, das kann ZIPs bauen, die unter Windows funktionieren. (wer hätte das gedacht? :-) )

mfg,

Roaster20
16.05.02, 10:22
Ok, jetzt weiß ich, wie ich es mache:

Die verschiedenen downloadbaren Dateien werden in einzelne Verzechnisse geschrieben. Jedes dieser Verzeichnisse ist mit einer .htaccess Datei gesichert. Über $REMOTE_USER erfahre ich den aktuell eingeloggten User (hätte ich früher auf linuxforen.de geschaut, hätte ich mir viel Sucharbeit erspart, hier gab es einen ähnlichen Topic).
Nachdem der User sich angemeldet hat, wird der Download über folgendes Skript gestartet (thx to koehntopp.de):

---

# $download sei der Bezeichner für die zu ladende Datei

# Dieses Verzeichnis liegt außerhalb der Document_Root und
# ist nicht per URL zuzugreifen.
$basedir = "/home/www/download";

# Übersetzung von Download-Bezeichner in Dateinamen.
$filelist = array(
"file1" => "area1/datei1.zip",
"file2" => "area1/datei2.zip",
"file3" => "area2/datei1.zip"
);

# Einbruchsversuch abfangen.
if ($filelist[$download] == "")
die("Datei $download nicht vorhanden.");

# Vertrauenswürdigen Dateinamen basteln.
$filename = sprintf("%s/%s", $basedir, $filelist[$download]);

# Passenden Datentyp erzeugen.
header("Content-Type: x-type/subtype");

# Passenden Dateinamen im Download-Requester vorgeben,
# z.B. den Original-Dateinamen
$save_as_name = basename($filelist[$download]);
header("Content-Disposition: attachment; filename=\"$save_as_name\"");

# Datei ausgeben.
readfile($filename);

---

Bevor das passiert, frage ich wie gesagt den eingeloggten User ab und schreibe über echo .. >> den Namen in eine Datei. Jetzt kann ich mit PHP eine Datei ausführen und starte somit gzip auf der Consolenebene, um eine Datei anzufügen. Somit, Problem gelöst.

Thx für alle

Grüsse
Martin

PS: Hat jemand eine angenehmere Lösung ? In .htaccess Dateien kann ich kein Apache File oder Directory Statement benutzen ?!

Duke
16.05.02, 13:01
UNd das funktioniert auch mit PHP zip dateien erstellen ? Oder wird die einfach nur .zip genannt und funktioniert nicht richtig

TNT
16.05.02, 17:46
Hi,

PHP kann vieles. Unter anderem zur laufzeit zippen, Bildchen malen, PDF`s erzeugen...
Nur leider nicht Kaffee kochen :(

Die Binarys müssen aber entsprechend übesetzt werden. D.h. dass die entsprechenden Libraries mit eingebunden werden müssen.

Grüsse

Thomas

Duke
16.05.02, 17:54
Ich meine ich mache PHP für Webangelegenheiten schon ein bisschen aber die ganzen Befehle in der Sicht habe ich noch nie gesehen gibt es da eine passende Seite oder ein Buch mich interessiert sowieso linuxskripten sag ich mal

TNT
16.05.02, 17:58
Hi,

die offizielle PHP-Doku ist doch eigentlich ganz gut. Da steht ne Mende drin.

An Büchern habe ich folgendes:

PHP 4 Turorial und Referenz ISBN 3-932311-79-5

Webanwendungen mit PHP 4 entwickeln ISBN 3-8273-1730-4

PHP4 + Mysql ISBN 3-8158-2043-X

Grüsse

Thomas

Duke
16.05.02, 18:51
Also ich habe so ein 750 Seiten PHP buch von BHV da steht in der Hinsicht nichts drin ich schau mir deins bei amazon mal an

Roaster20
17.05.02, 06:52
Quoted from koehntopp.de:

---

PHP kennt nicht weniger als fünf Mechanismen, um externe Kommandos (z.B. Unix-Shellbefehle) von PHP aus zu starten. Alle diese Mechanismen können zu einem Sicherheitsrisiko werden, wenn man Benutzereingaben Bestandteil der ausgeführten Kommandos oder Dateinamen werden läßt.

Durch Anwendung der Funktion EscapeShellCmd() kann man das Risiko etwas vermindern (etwa: system(escapeshellcmd($cmd)) ). Dennoch empfiehlt es sich, die Parameter, die in die Gestaltung von $cmd eingehen, sorgfältig zu prüfen.

Externe Kommandos werden bei Verwendung von CGI PHP unter der Identität des CGI-Wrappers ausgeführt, bei Verwendung einer Modulversion von PHP mit der Identität des Webservers (siehe auch Webserver verstehen und tunen von Kristian Köhntopp).

Will man ein externes Kommando einfach nur ausführen, kann man das betreffende Kommando einfach in Backticks setzen:


--------------------------------------------------------------------------------

`touch yyy`;


--------------------------------------------------------------------------------

Dies wird im selben Verzeichnis wie das PHP-Script die Datei yyy erzeugen, falls der Webserver dort Schreibrecht hat.

Alternativ kann man ein Kommando durch die Funktion exec() starten lassen. Auch hier ist die Ausgabe nicht sichtbar, kann aber in einem Array abgelegt werden:


--------------------------------------------------------------------------------

exec("cat /etc/group", $lines, $result);
echo "result = $result<br>";

echo "Lines<br>\n";
reset($lines);
while(list($k, $v) = each($lines)):
echo "k=$k v=$v<br>\n";
endwhile;


--------------------------------------------------------------------------------

Die Ausgabe des Befehls wird im Feld $lines zur Verfügung gestellt, der Exitcode des Befehls in $result .

Die Funktion system() gibt die Ausgabe des Unix-Kommandos dagegen an den Webserver weiter. Ebenso passthru() :


--------------------------------------------------------------------------------

system("ls -l", $result);
echo "Result: $result<br>\n";

passthru("ls -l", $result);
echo "Result: $result<br>\n";


--------------------------------------------------------------------------------

Schließlich kann man externe Kommandos noch mit Hilfe der Funktion popen() starten:


--------------------------------------------------------------------------------

$fp = popen("ls -l", "r");
while($line = fgets($fp, 1024)):
printf("%s<br>\n", $line);
endwhile;


--------------------------------------------------------------------------------

Im safe_mode unterliegt die Programmausführung weiteren Einschränkungen.

Antwort von Johannes Frömter
PHP wartet bei der Ausführung externer Programme auf deren Beendigung, d.h. das PHP-Script ist solange blockiert, bis das aufgerufene Programm fertig ist. Um dies zu vermeiden, muß man den Output des Programms umleiten, z.B. nach /dev/null:


--------------------------------------------------------------------------------

exec("programm >/dev/null 2>&1");


--------------------------------------------------------------------------------


--- Quote End

Auf Kommandoebene kannst Du ja ohne Probleme gzip mit entsprechenden Flags starten. Ich nehme mir nur das Flag "add file" und haenge somit die vorher von PHP generierte ins ZIP mit rein. Also no Prob.

Vielen Dank für Eure Hilfen
Grüsse
Martin :cool:

Duke
17.05.02, 12:06
Thx ich denke das hat mich schonmal ein bisschen weitergebracht obwohl ich noch nicht ganz genau vorstellungen von sowas habe kommt aber noch wie bei allen Dingen