| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

24-07-2010, 12:48
|
|
2Bad4You
Registrierter Benutzer
|
|
Registriert seit: Jun 2007
Beiträge: 101
|
|
Video Datei Download
Hey,
Ich habe ein Problem damit Video Files zum Download anzubieten. Wenn ich z.b ein .avi File downloaden möchte, öffnet sich der Downloaddialog des Browsers und die Dateigröße wird korrekt angezeigt. Nach dem Download ist das Video allerdings dann nur 0kb groß und läßt sich nicht abspielen. Das Problem tritt bwi .avi oder .divx etc files auf. Mp3 Files, txt dateien, word dokumente etc lassen sich problemlos downloaden. Der Download wird folgendermaßen eingeleitet:
PHP-Code:
$filesize = filesize($folder."/".$_GET['filename']); // Get Filesize // Set Headers header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header("Content-Disposition: attachment; filename=".basename($_GET['filename']).""); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header("Content-Length: ".$filesize.""); // Send Output to Browser flush(); readfile($folder."/".$_GET['filename']); // Exit the Script exit;
Klappt ja auch soweit, nur bei Videodatein halt nicht. Gibt es bei diesen irgendwas besonders zu beachten oder woran könnte das liegen?
lg
2Bad4You
Geändert von 2Bad4You (24-07-2010 um 15:04 Uhr)
|

24-07-2010, 13:30
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Texteditor nehmen, runtergeladene Datei damit öffnen - Fehlermeldungen?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

24-07-2010, 15:03
|
|
2Bad4You
Registrierter Benutzer
|
|
Registriert seit: Jun 2007
Beiträge: 101
|
|
Komplett leer das Dokument. Hatte mich oben auch vertan, das File ist nich 1kb sondern 0kb groß. Mit Editor oder Wordpad geöffnet = weiße Seite. Also komplett leer. hmm
|

24-07-2010, 15:42
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Mit welchem Browser testest du - IE?
Der ist bei solchen Sachen immer etwas zickig, was die Caching-Header angeht.
Schmeiß' die drei header-Zeilen vor der letzten mal raus.
Btw., dass das Script in der Form eine scheunentorgroße Sicherheitslücke aufreißt, weil man darüber sämtliche Dateien von deinem Webspace herunterladen kann, ist dir hoffentlich bewusst.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

24-07-2010, 15:56
|
|
2Bad4You
Registrierter Benutzer
|
|
Registriert seit: Jun 2007
Beiträge: 101
|
|
Ich habe es mit dem Firefox versucht. Im IE8 ist genau das selbe problem. Auch das rausschmeißen der 3 Header Zeilen bringt keine Änderung ...
Danke für den Hinweis zwecks Sicherheit. Ich habe etwas weiter oben diese Abfrage drin:
PHP-Code:
// Check if $_GET Parameter for Folder isset if(isset($_GET['folder']) && ($_GET['folder'] != "")) { $folder = DOWNLOAD_FOLDER."/".$_GET['folder']; // If it is set, bind Variable to $_GET folder key } else { $folder = DOWNLOAD_FOLDER; // If it is not set, bind Variable to Download Folder specified in Config } // Check IF the $_GET Parameter with the filename is correct if(!isset($_GET['filename']) || ($_GET['filename'] == "") || (!is_file($folder."/".$_GET['filename']))) { echo "An Error occured. Please go back to the Main Menu. Use the Link below for this."; echo "<br />"; echo "<a href='index.php?action=listFiles'>Go Back to the Main Page.</a>"; die(); }
Dadruch sollte es doch nicht möglich sein beliebige Dateien über das Script zu downloaden oder? Es werden ja nur Dateien zugelassen die in einem bestimmten Ordner liegen. Oder hab ich da noch irgendwas vergessen? Bin für jeden Tipp dankbar.
Geändert von 2Bad4You (24-07-2010 um 16:05 Uhr)
|

24-07-2010, 16:07
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Na dann kommentiere erst mal alle Header aus, und schau ob Fehlermeldungen angezeigt werden.
error_reporting auf E_ALL und display_errors auf on hast du ja hoffentlich?
Und nein, deine Sicherheitsprüfung reicht selbstverständlich noch nicht aus, da man aus dem angegebenen Verzeichnis immer noch ganz leicht heraus kommt.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

24-07-2010, 16:25
|
|
2Bad4You
Registrierter Benutzer
|
|
Registriert seit: Jun 2007
Beiträge: 101
|
|
Ja Error Reporting ist an und display Errors auch. Wenn ich die Header auskommentiere und auf einen Download Klicke kommt eine weiße Seite und es werden keine Fehler angezeigt.
Der Downloadteil des Scriptes sieht jetzt so aus:
PHP-Code:
if($action == "downloadFile") { // Check Access Mode. If private -> check if logged_in // isset to 1 and check if Username is correct, again. For safety reasons. if(ACCESS_MODE == "private" && (!isset($_SESSION['logged_in'])) || ((ACCESS_MODE == "private") && ($_SESSION['logged_in'] == "0")) || ((ACCESS_MODE == "private") && (!in_array($_SESSION['username'], $usernames, true)))) { header("Location: index.php?action=login"); } // Check if $_GET Parameter for Folder isset if(isset($_GET['folder']) && ($_GET['folder'] != "")) { $folder = DOWNLOAD_FOLDER."/".$_GET['folder']; // If it is set, bind Variable to $_GET folder key } else { $folder = DOWNLOAD_FOLDER; // If it is not set, bind Variable to Download Folder specified in Config } // Check IF the $_GET Parameter with the filename is correct if(!isset($_GET['filename']) || ($_GET['filename'] == "") || (!is_file($folder."/".$_GET['filename']))) { echo "An Error occured. Please go back to the Main Menu. Use the Link below for this."; echo "<br />"; echo "<a href='index.php?action=listFiles'>Go Back to the Main Page.</a>"; die(); } $filesize = filesize($folder."/".$_GET['filename']); // Get Filesize // Set Headers //header('Content-Description: File Transfer'); //header('Content-Type: application/octet-stream'); //header("Content-Disposition: attachment; filename=".$_GET['filename'].""); //header('Content-Transfer-Encoding: binary'); //header('Expires: 0'); //header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); //header('Pragma: public'); //header("Content-Length: ".$filesize.""); // Send Output to Browser flush(); readfile($folder."/".$_GET['filename']); // Exit the Script exit; }
Ich weiß nicht woran das liegen soll da es ja bei allen anderen Files auch funktioniert. Habs mal mit einem .wmv File getestet grade und hab festgestellt das es damit z.b auch geht. Also er mag also nur .avi oder .divx nicht.
Könntest du bitte mal ein Beispiel geben wie man noch leicht aus dem Verzeichnis rauskommt? Ich hab eben mal was getestet in einen anderen Pfad zuspringen aber das hat nicht geklappt. Deswegen dachte ich das wäre dagegen abgesichert. Wäre dir für ein Beispiel sehr dankbar.
Geändert von 2Bad4You (24-07-2010 um 16:33 Uhr)
|

24-07-2010, 16:33
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.309
|
|
Nimm mal probehalber anstelle von
PHP-Code:
flush();
readfile($folder."/".$_GET['filename']);
// Exit the Script
exit;
ein
PHP-Code:
$file = file_get_contents($folder."/".$_GET['filename']);
echo $file;
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

24-07-2010, 16:43
|
|
2Bad4You
Registrierter Benutzer
|
|
Registriert seit: Jun 2007
Beiträge: 101
|
|
Ahhhh damit kommt man der Sache schon näher. Jetzt steht eine Fehlermeldung drin in dem gedownloadeten File. Ich habe gar nicht mehr dran gedacht dass das ganze eventuell kein Datei Problem sondern ein Memory Problem sein kann. Folgende Fehlermeldung steht nämlich jetzt drin:
Zitat:
|
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 731727872 bytes) in G:\xampp\htdocs\filesbay\index.php on line 359
|
Daran hatte ich gar nicht mehr gedacht dass es da zu Problemen kommen kann ... Danke
|

24-07-2010, 17:13
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von 2Bad4You
Der Downloadteil des Scriptes sieht jetzt so aus:
PHP-Code:
if($action == "downloadFile")
|
Und wo kommt $action her?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

24-07-2010, 17:57
|
|
2Bad4You
Registrierter Benutzer
|
|
Registriert seit: Jun 2007
Beiträge: 101
|
|
$action kommt aus dem $_GET Array.
PHP-Code:
if(!isset($_GET['action']) || ($_GET['action'] == "")) // If action Atribute is empty set $action to login
{
$action = "login"; // If Empty set to default: login
}
else
{
$action = $_GET['action']; // IF Not Empty set to provided Action
}
Habe nicht das komplette Script gepostet, sondern nur den für den download relevanten Teil.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|