ich m�chte gern verschieden Dateien, die der User vorher ausw�hlt, per
PHP zippen. Ich mache das gem�� unten angef�hrten Beispiel.
Klappt alles wunderbar ... aber:
Das erzeugte Zip-File erh�lt immer die Berechtigung 0600 und ist damit
leider nicht runterladbar ...
Chmod ist auf dem Server nicht erlaubt ...
Was k�nnte man noch probieren. Oder kennt jemand noch eine elegante
M�glichkeit, wie ich einen User aus verschiedenen Dateien einige
ausw�hlen lassen kann, die er dann geb�ndelt downloaded kann?
Gr��e,
Guido
---Beispiel von www.php.net---
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
$zip->addFile('/path/to/index.txt', 'newname.txt');
$zip->close();
echo 'ok';
} else {
echo 'failed';
}
?>
------------------------------
--
Why is 6 afraid of 7? Because 7, 8, 9!
Micha
> Das erzeugte Zip-File erh�lt immer die Berechtigung 0600 und ist damit
> leider nicht runterladbar ...
Wie bitte?
0600 hei�t, dass der Eigent�mer der Datei Lese- und Schreibrecht hat.
Der Eigent�mer bei neuen Dateien ist der Ersteller, in diesem Fall also
der Webserver. Und der soll nicht in der Lage sein, Dateien, die er
selber erstellt hat und die er auch lesen kann, auszuliefern?
Wie lautet denn die Fehlermeldung?
Gru�. Claus
> 0600 hei�t, dass der Eigent�mer der Datei Lese- und Schreibrecht hat.
> Der Eigent�mer bei neuen Dateien ist der Ersteller, in diesem Fall also
> der Webserver. Und der soll nicht in der Lage sein, Dateien, die er
> selber erstellt hat und die er auch lesen kann, auszuliefern?
Bei vielen Massenhostern trifft das tats�chlich zu. Dort ist oft der
Nutzer unter dem PHP l�uft nur aus der selben Gruppe wie der Server
selbst aber nicht der selbe Nutzer. Auch wenn dieses Verhalten, das dann
0177 als Maske genutzt wird, eine Fehlkonfiguration sein wird. Hatte
ich leider schon viel zu oft. Aber man kann ja zum Gl�ck frei seinen
Hoster wechseln.
MfG, Ulf
> 0600 hei�t, dass der Eigent�mer der Datei Lese- und Schreibrecht hat.
> Der Eigent�mer bei neuen Dateien ist der Ersteller, in diesem Fall also
> der Webserver. Und der soll nicht in der Lage sein, Dateien, die er
> selber erstellt hat und die er auch lesen kann, auszuliefern?
>
> Wie lautet denn die Fehlermeldung?
Fehler 403 wenn man die Datei direkt verlinkt ...
>> Das erzeugte Zip-File erh�lt immer die Berechtigung 0600 und ist damit
>> leider nicht runterladbar ...
>
> http://php.net/umask
Und wie n�tzt mir das? Damit kann man ja offensichtlich nur Rechte
einschr�nken, nicht erweitern ...
Gr��e,
Guido
Ja, und das scheint Dein Webhoster zu tun, oder? Er benutzt f�r den
User, unter dem PHP l�uft, doch wohl - wie Ulf schrob - die Maske 0177.
Probiere doch stattdessen mal z. B. 0117, dann sollte die Datei die
Berechtigungen 0660 haben.
Einen Versuch ist es wert, oder?
HTH
Werner
,---[ http://www.linux-praxis.de/lpic1/manpages/umask.html ]
| Das umask-Kommando zeigt, bzw. ver�ndert die Dateierzeugungsmaske,
| nach der berechnet wird, welche Zugriffsrechte eine neu erstellte
| Datei bekommt.
`---|
Micha
Der Ersteller der Zip-Datei ist ja wohl der Ausf�hrer des PHP-Prozesses,
der somit auch der Eigent�mer ist. In Multihost-Umgebungen wird f�r PHP
und Apache Suexec eingesetzt, was den Ausf�hrer im Kontext des
(hoffentlich) Virtualhosts �ndert. Scheinbar wird das in deinem Fall f�r
entweder Apache oder PHP nicht gemacht, weshalb sich die Ausf�hrer der
beiden Zugriffsformen (zip erzeugen: PHP, statisch verlinktes Zip
abrufen: Apache) unterscheiden.
Ein Workaround w�re, den Zip-Erzeuger auch das Zip mittels z.B.
readfile[1] zur�ckgeben zu lassen. Dir sollte aber klar sein, dass du
damit Ressourcen verschenkst. Optimalerweise l�uft der PHP-Prozess als
selber Benutzer, wie der dazugeh�rige Apache-Prozess.
ciao
Ulf
> Probiere doch stattdessen mal z. B. 0117, dann sollte die Datei die
> Berechtigungen 0660 haben.
Okay, das habe ich versucht.
<?php
umask(0117);
$umask = umask(); //- returns the current umask, which is a "int"
$umask = decoct($umask); //- Now, $umask is a "string"
echo $umask;
?>
Hier wird jetzt 117 ausgegeben ...
Jetzt wird das Zip File erzeugt ....
<?php
echo "permissions: ";
echo substr(decoct(fileperms($path.$filename)),1);
?>
Hier erscheint weiterhin 0600 ...
Wie kann das sein?
LG,
> Ein Workaround w�re, den Zip-Erzeuger auch das Zip mittels z.B. readfile[1]
> zur�ckgeben zu lassen. Dir sollte aber klar sein, dass du damit Ressourcen
> verschenkst.
Mal von den Ressourcen abgesehen - ich habe versucht, das File gleich
als Download anzubieten, in dem ich einen neuen header sende. Leider
steht in dem File, das dann heruntergeladen wird nur ein Error drin
(n�mlich dass der Zugriff verweigert wird ...)
Gru�,
Guido
Mal ganz dumm gefragt: Du erzeugst das Zip schon per HTTP-Request,
ebenso, wie der anschlie�ende Request zum Abrufen der Datei, oder?
M�gliche Fehlerquellen sind an dieser Stelle z.B. Cronjobs, die nicht
als PHP/Apache-User ausgef�hrt werden oder verschiedene Hosts in
Multihost-Umgebungen.
ciao
Ulf
> Bitte erl�utere deine Aussage "... in dem ich einen neuen header
> sende".
Ich hab sinngem�� soetwas im Skipt:
<?php
header("HTTP/1.1 200 OK");
header("Content-Type: application/force-download");
header('Content-Disposition: attachment; filename="Zip-File-Name.zip"');
header("Content-Transfer-Encoding: binary");
// Zip File senden
echo $zipfile->file();
?>
Dabei habe ich statt echo auch readfile genommen. Au�erdem habe ich alle
m�glichen �nderungen im Content-Type (zip, ...) usw. vorgenommen. Immer
erhalte ich eine Datei (die Zip-File-Name.zip hei�t) und sich aber nicht
�ffnen l�sst. Wenn ich sie mit nem Editor �ffne, steht da sowas drin wie
"Permission denied"....
> Es reicht nicht, wenn du einem Location-Header sendest, der auf die
> per HTTP erreichbare physische Datei zeigt und den Browser zum
> Download auffordert. der Inhalt ist der gleiche (n�mlich in deinem
> Falle "Zugriff verweigert".
Exakt.
> Im �brigen zeigt der Fehlercode 403, dass
> es sich nicht um einen PHP-Fehler handelt, sondern um ein
> Apache-Problem, der versucht, die angeforderten Inhalte auszuliefern
> (Es sei denn, du manipulierst den Header mittels PHP auf diesen
> Fehlercode).
Ja, das ist mir klar. Und der Webserver meint, die Datei sei nicht f�r
den anfordernden Nutzer bestimmt.
> Mal ganz dumm gefragt: Du erzeugst das Zip schon per HTTP-Request, ebenso,
> wie der anschlie�ende Request zum Abrufen der Datei, oder?
Ja, steht alles im gleichen Skrip und wird nacheinander abgearbeitet...
> M�gliche Fehlerquellen sind an dieser Stelle z.B. Cronjobs, die nicht als
> PHP/Apache-User ausgef�hrt werden oder verschiedene Hosts in
> Multihost-Umgebungen.
Nichts dergleichen wird gemacht.
Sicherheitshalber w�rde ich auch mal den Browser-Cache l�schen, bzw.
einen anderen benutzen (oder dich mit Cache-Headern vertraut machen).
Ich hatte schon oft das Problem, dass der Browser fehlerhafte Responses
gecached hat obwohl der Fehler auf Serverseite l�ngst behoben war.
ciao und erstmal sch�nes Wochenende :)
Ulf
> Ich hab sinngem�� soetwas im Skipt:
Mich h�tte an der Stelle ja tats�chlich mal Interessiert, was du da
*wirklich* stehen hast. Sinngem�� ist wenig hilfreich.
> echo $zipfile->file();
Kommt woher und ist was?
> Dabei habe ich statt echo auch readfile genommen.
readfile auf was? Auf '$path.$filename'?
> Wenn ich sie mit nem Editor �ffne, steht da sowas drin wie
> "Permission denied"....
"Sowas wie" ist genauso hilfreich wie "Sinngem��". Wer ist der
Eigent�mer des generierten Zip-Files? Unter welchem User l�uft der
Webserver? Wie lautet die tats�chliche Fehlermeldung?
> Ja, das ist mir klar. Und der Webserver
Was f�r ein Webserver ist das �berhaupt? Apache? Auf welchem OS?
> meint, die Datei sei nicht f�r den anfordernden Nutzer bestimmt.
H�?
Micha
Das "sinngem��" stand da, weil ich zig M�glichkeiten versucht habe und
alle zu dem gleichen Fehler f�hren.
Eine davon: Direkt das Zip-File verlinken. Der Code sieht so aus (sicher
grottig, aber funktioniert ...)
-------------------------------------------
,----
| <?php
| // Zip-datei im Download-Ordner erstellen
| $zip = new ZipArchive();
| $path = '../downloads/';
| $filename = 'fotos'.time().'.zip';
|
| if ($zip->open($path.$filename, ZIPARCHIVE::CREATE)!==TRUE)
| {
| exit("cannot open <$filename>\n");
| }
|
| // ausgew�hlte Bilder ins Zip-Archiv packen
| foreach ($bilder as $bild) {
| $zip->addFile('test/'.$bild,$bild);
| }
| $zip->close();
|
| // Einen Download-Link angeben
|
| echo 'Folgende Dateien wurden gepackt:<br>';
| foreach ($bilder as $bild){
| echo $bild,'<br>';
| }
| echo '<a href="',$path.$filename,'">Datei runterladen</a>';
| }
| ?>
`----
Der Fehler ist dann:
,----
| Fehler 403
|
| Die angeforderte URL gibt es hier nicht!
`----
Au�erdem habe ich statt des links versucht einen download zu erzwingen:
,----
| // Header f�r Download senden
| header("HTTP/1.1 200 OK");
| header("Content-Type: application/force-download");
| header('Content-Disposition: attachment; filename="Zip-File-Name.zip"');
| header("Content-Transfer-Encoding: binary");
|
| // Zip File senden
| echo $zipfile;
`----
Dann bietet mir der Browser im Dialog ein 842Byte Zip-File an (was viel
zu klein ist). Mit nem Editor betrachtet steht dann da drin:
,----
| Warning: readfile(fotos1246730154.zip) [{function.readfile}]: failed
| to open stream: Permission denied in
| /mnt/homes0/donath/public_html/bilder/bilder.php on line 88
`----
K�nnte man doch als "sinngem��" permission denied interpretieren, oder? :)
> echo $zipfile->file();
> Kommt woher und ist was?
Ich hatte per google auch mal einen Vorschlag, statt readfile echo zu
nehmen. macht aber offensichtlich wenig sinn...
> Eigent�mer des generierten Zip-Files?
Die Berechtigung steht auf 0600 ...
> Unter welchem User l�uft der Webserver?
Das wei� ich nicht - wie kann ich das rausfinden?
> Was f�r ein Webserver ist das �berhaupt? Apache? Auf welchem OS?
Apache
>> meint, die Datei sei nicht f�r den anfordernden Nutzer bestimmt.
> H�?
Meines Erachtens ist es genau das, wenn da Permission denied steht,
oder?
Wenn man die letzte '}' entfernt... :-)
> | echo '<a href="',$path.$filename,'">Datei runterladen</a>';
>
> > Eigent�mer des generierten Zip-Files?
>
> Die Berechtigung steht auf 0600 ...
Nicht die Berechtigungen, wer der *Eigent�mer* der Datei ist.
print_r(posix_getpwuid(fileowner($path.$filename)));
> > Unter welchem User l�uft der Webserver?
>
> Das wei� ich nicht - wie kann ich das rausfinden?
Im Zweifel schaue einfach mit 'passthru("ps aux")' nach.
> > Was f�r ein Webserver ist das �berhaupt? Apache? Auf welchem OS?
>
> Apache
Unter welchem OS? Also unter welchem Betriebssystem.
Micha
> Wenn man die letzte '}' entfernt... :-)
Ich hatte nur den relevanten Teil kopiert und offensichtlich aus
Versehen noch eine Klammer einer vorigen Bedingung zu viel erwischt.
>> | echo '<a href="',$path.$filename,'">Datei runterladen</a>';
>>
>> > Eigentümer des generierten Zip-Files?
>>
>> Die Berechtigung steht auf 0600 ...
>
> Nicht die Berechtigungen, wer der *Eigentümer* der Datei ist.
>
> print_r(posix_getpwuid(fileowner($path.$filename)));
Hier wird es sehr merkwürdig ...
echo $_SERVER["SERVER_SOFTWARE"];
liefert:
,----
| Apache/2.2.3 (Linux/SUSE) PHP/5.2.0 with Suhosin-Patch mod_ssl/2.2.3
| OpenSSL/0.9.8d mod_python/3.2.10 Python/2.5 mod_perl/2.0.2 Perl/v5.8.8
`----
Sieht also aus, als wäre es ein SUSE Linx Server, aber ...
print_r(posix_getpwuid(fileowner($path.$filename)))
Fatal error: Call to undefined function posix_getpwuid() in
/mnt/homes0/donath/public_html/test.php on line 80
Wenn ich nur fileowner aufrufe, liefert es lediglich "0". Lt. Google
passiert sowas auf einem Windows-Server ...
Ich hab dann noch versucht
echo getenv('USERNAME');
Liefert aber gar nix zurück ...
>> > Unter welchem User läuft der Webserver?
>> Das weiß ich nicht - wie kann ich das rausfinden?
>
> Im Zweifel schaue einfach mit 'passthru("ps aux")' nach.
Liefert:
,----
| USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 808 76 ? Ss 2008 11:47 init [5] root 2 0.0 0.0 0 0 ? S 2008 0:33 [migration/0] root 3 0.0 0.0 0 0 ? SN 2008 9:08 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S 2008 1:15 [migration/1] root 5 0.0 0.0 0 0 ? SN 2008 0:01 [ksoftirqd/1] root 6 0.0 0.0 0 0 ? S 2008 0:40 [migration/2] root 7 0.0 0.0 0 0 ? SN 2008 0:01 [ksoftirqd/2] root 8 0.0 0.0 0 0 ? S 2008 0:39 [migration/3] root 9 0.0 0.0 0 0 ? SN 2008 0:00 [ksoftirqd/3] root 10 0.0 0.0 0 0 ? S< 2008 2:48 [events/0] root 11 0.0 0.0 0 0 ? S< 2008 0:01 [events/1] root 12 0.0 0.0 0 0 ? S< 2008 0:11 [events/2] root 13 0.0 0.0 0 0 ? S< 2008 0:01 [events/3] root 14 0.0 0.0 0 0 ? S< 2008 0:49 [khelper] root 15 0.0 0.0 0 0 ? S< 2008 0:00 [kthread] root 22 0.0 0.0 0 0 ? S< 2008 0:35 [kblockd/0] root 23 0.0 0.0 0 0 ? S< 2008 0:01 [kblockd/1] root 24 0.0 0.0 0 0 ? S< 2008 0:02 [kblockd/2] root 25 0.0 0.0 0 0 ? S< 2008 0:00 [kblockd/3] root 26 0.0 0.0 0 0 ? S< 2008 13:41 [kacpid] root 27 0.0 0.0 0 0 ? S< 2008 0:00 [kacpi_notify] root 131 0.0 0.0 0 0 ? S< 2008 0:00 [cqueue/0] root 132 0.0 0.0 0 0 ? S< 2008 0:00 [cqueue/1] root 133 0.0 0.0 0 0 ? S< 2008 0:00 [cqueue/2] root 134 0.0 0.0 0 0 ? S< 2008 0:00 [cqueue/3] root 135 0.0 0.0 0 0 ? S< 2008 0:00 [kseriod] root 192 0.0 0.0 0 0 ? S< 2008 13:50 [kswapd0] root 193 0.0 0.0 0 0 ? S< 2008 0:00 [aio/0] root 194 0.0 0.0 0 0 ? S< 2008 0:00 [aio/1] root 195 0.0 0.0 0 0 ? S< 2008 0:00 [aio/2] root 196 0.0 0.0 0 0 ? S< 2008 0:00 [aio/3] root 444 0.0 0.0 0 0 ? S< 2008 0:00 [kpsmoused] root 950 0.0 0.0 0 0 ? S< 2008 43:08 [kjournald] root 998 0.0 0.0 12304 436 ? S
`----
>> > Was für ein Webserver ist das überhaupt? Apache? Auf welchem OS?
>>
>> Apache
>
> Unter welchem OS? Also unter welchem Betriebssystem.
Ich dachte eigentlich immer, es sei Linux ... sieht oben ...
Gruß,
> | Apache/2.2.3 (Linux/SUSE) PHP/5.2.0 with Suhosin-Patch
Ich kenne den Suhosin-Patch nicht, k�nnte mir aber vorstellen das
dieser an deinem Problem nicht ganz unschuldig ist.
> Fatal error: Call to undefined function posix_getpwuid() in
> /mnt/homes0/donath/public_html/test.php on line 80
*seufz*
passthru( "ls -l " . $path.$filename );
stat ( $path.$filename );
Oder schaue doch einfach per FTP nach wem die geh�rt...
> Wenn ich nur fileowner aufrufe, liefert es lediglich "0". Lt. Google
> passiert sowas auf einem Windows-Server ...
,---[ http://php.net/manual/en/function.fileowner.php ]
| Returns the user ID of the owner of the file, or FALSE in case of an
| error.
`---|
Was bedeuten w�rde, dass die Datei root geh�rt (uid 0). H�?
Wem geh�rt denn '../downloads/'?
> > Im Zweifel schaue einfach mit 'passthru("ps aux")' nach.
>
> Liefert:
*seufz*
Es scheint, dass du nicht alle Prozesse sehen darfst...
> Ich dachte eigentlich immer, es sei Linux ... sieht oben ...
Wird ein Linux sein...
Micha
> Ich kenne den Suhosin-Patch nicht, k�nnte mir aber vorstellen das
> dieser an deinem Problem nicht ganz unschuldig ist.
Mhm, nachdem ich einige Infos dazu �berflogen habe, k�nnte das durchaus
sein, ja ... sehr �rgerlich ...
> passthru( "ls -l " . $path.$filename );
> stat ( $path.$filename );
-rw------- 1 root root 646803 Jul 6 13:01 test.zip
> Was bedeuten w�rde, dass die Datei root geh�rt (uid 0). H�?
Ja offensichtlich ist es so ...
> Wem geh�rt denn '../downloads/'?
Mhm, jetzt wo Du es sagst - alle Dateien und Vz. geh�ren root.
Allerdings hat das Vz. die Berechtigung -rwxrwxrwx. Diese haben auch
Dateien, die ich per ftp hochlade, sprich html oder php-Dateien.
Nur die Datei, die das PHP skript selbst erzeugt hat -rw-------
Gr��e,
Oh mann...
> > Wem geh�rt denn '../downloads/'?
>
> Mhm, jetzt wo Du es sagst - alle Dateien und Vz. geh�ren root.
> Allerdings hat das Vz. die Berechtigung -rwxrwxrwx. Diese haben auch
> Dateien, die ich per ftp hochlade, sprich html oder php-Dateien.
Dar�ber solltest du mal mit deinem Hoster sprechen.
> Nur die Datei, die das PHP skript selbst erzeugt hat -rw-------
Was, wie ich vermute, an diesem Suhosin-Patch liegt.
Micha
> Dar�ber solltest du mal mit deinem Hoster sprechen.
Ja, mach ich!
Danke f�r die geduldige Hilfe :)
So nebenbei:
Werden nur Dateien von ZipArchive mit diesen Berechtigungen angelegt? Oder
auch Dateien die du über z.B. fopen() / touch() usw. erzeugst.
Gruß
Carsten
> So nebenbei:
> Werden nur Dateien von ZipArchive mit diesen Berechtigungen angelegt? Oder
> auch Dateien die du �ber z.B. fopen() / touch() usw. erzeugst.
Auch solche werden mit diesen Berechtigungen erzeugt. Was v�llig absurd
ist. Ich kann innerhalb eines Skriptes keine Datei anlegen, sie wieder
schlie�en, und erneut �ffnen .... denn beim �ffnen kommt permission
denied.
Gru�,
>
> Auch solche werden mit diesen Berechtigungen erzeugt. Was v�llig absurd
> ist. Ich kann innerhalb eines Skriptes keine Datei anlegen, sie wieder
> schlie�en, und erneut �ffnen .... denn beim �ffnen kommt permission
> denied.
Daraus folgt, dass der Server kaputt konfiguriert ist.
Ich f�rchte, das werden nicht die einzigen Probleme mit dem Hoster
bleiben.
Sieh' zu, dass du da weg kommst...
Servus,
Konni
--
"Die Unmenschlichkeit des praktizierten Atheismus haben im ver-
gangenen Jahrhundert die gottlosen Regime des Nationalsozialismus
und des Kommunismus mit ihren Straflagern, ihrer Geheimpolizei und
ihren Massenmorden in grausamer Weise bewiesen" -- Bischof Mixa
> Carsten Wiedmann schrieb:
>
>> Werden nur Dateien von ZipArchive mit diesen Berechtigungen angelegt? Oder
>> auch Dateien die du �ber z.B. fopen() / touch() usw. erzeugst.
>
> Auch solche werden mit diesen Berechtigungen erzeugt. Was v�llig absurd
> ist. Ich kann innerhalb eines Skriptes keine Datei anlegen, sie wieder
> schlie�en, und erneut �ffnen .... denn beim �ffnen kommt permission
> denied.
Das ist jetzt eindeutig eine Fehlkonfiguration des Servers.
Du solltest Deinem Hoster sofort kr�ftig auf die F��e treten oder - was
wahrscheinlich sinnvoller w�re - Dir gleich einen vern�nftigen Hoster
suchen.
Verr�tst Du uns, wer dieser tolle Hoster ist?
Gru�. Claus
> Verr�tst Du uns, wer dieser tolle Hoster ist?
Kein kommerzieller, sondern eine Uni. Insofern kann ich mich da nicht
wirklich aufregen ... Bin jetzt zu nem kommerziellen gezogen und alles
klappt wunderbar ...