kostenloser Webspace werbefrei: lima-city


PHP Proxy Download Script

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    voloya

    voloya hat kostenlosen Webspace.

    Hallo :wave:

    Ich suche nach einer Möglichkeit mit PHP eine Datei, die auf einem anderen Server liegt, zum Benutzer als Download weiterzuleiten.
    Was ich bisher fand war dieser Thread:

    http://www.lima-city.de/thread/php-temp-ordner-auf-download-server-erstellen

    Das Script dort bricht jedoch immer nach 500 KB - 1 MB ab und der Webserver lighttpd hängt sich auf.
    //EDIT: Auf Apache2 bekomme ich lediglich die index.php zum Download :biggrin:

    Dann noch folgendes Script:
    http://developer.yahoo.com/javascript/samples/proxy/php_proxy_simple.txt
    .. welches ich nicht ausführen kann, da ich kein cURL habe.

    Und ansonsten habe ich nicht viel gefunden, außer dass man für große Dateien fopen verwenden kann:
    http://stackoverflow.com/questions/4054618/how-do-i-use-my-server-as-a-proxy-to-download-files-via-php:
    If the file is larger than a few megabytes, use fopen fread and frwrite download the file in chunks and send to the client in chunks.


    Bloß wie mache ich das? Es handelt sich übrigens um Filmdateien, 300 MB -2500 MB groß. Es wäre schön, wenn man den Download wiederaufnehmen kann und wenn man die Datei trotzdem mit VLC streamen kann.

    Wäre für Hilfe sehr dankbar.

    mfg :wave:

    Beitrag zuletzt geändert: 29.6.2012 11:50:57 von voloya
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. m******e

  4. Autor dieses Themas

    voloya

    voloya hat kostenlosen Webspace.

    Hallo :wave:

    menschle schrieb:
    Wie realisiere ich Downloads mit PHP?


    Das macht doch genau das gleiche wie das Script auf das ich in meinem ersten Post verwies? :wow:
    Habs jedenfalls auch ausprobiert, bricht immer noch nach ~1 MB ab und crasht lighttpd. :( Ich habe mal output_buffering deaktiviert, seitdem kann ich keinen force-reload mehr machen aber lighttpd hängt sich nicht mehr auf (trotzdem bricht der Download nach ~1MB als "vollständig" ab).

    mfg :wave:
  5. g****e

    Ich bin mal so frei und Verweise auf diesen Code:
    <?php 
    function download_file($file_name) { 
    
         if (!file_exists($file_name)) { die("<b>404 File not found!</b>"); } 
         
         $file_extension = strtolower(substr(strrchr($file_name,"."),1)); 
         $file_size = filesize($file_name); 
         $md5_sum = md5_file($file_name); 
         
        //This will set the Content-Type to the appropriate setting for the file 
         switch($file_extension) { 
             case "exe": $ctype="application/octet-stream"; break; 
             case "zip": $ctype="application/zip"; break; 
             case "mp3": $ctype="audio/mpeg"; break; 
             case "mpg":$ctype="video/mpeg"; break; 
             case "avi": $ctype="video/x-msvideo"; break; 
    
             //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files) 
             case "php": 
             case "htm": 
             case "html": 
             case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break; 
    
             default: $ctype="application/force-download"; 
         } 
         
         if (isset($_SERVER['HTTP_RANGE'])) { 
             $partial_content = true; 
             $range = explode("-", $_SERVER['HTTP_RANGE']); 
             $offset = intval($range[0]); 
             $length = intval($range[1]) - $offset; 
         } 
         else { 
             $partial_content = false; 
             $offset = 0; 
             $length = $file_size; 
         } 
         
         //read the data from the file 
         $handle = fopen($file_name, 'r'); 
         $buffer = ''; 
         fseek($handle, $offset); 
         $buffer = fread($handle, $length); 
         $md5_sum = md5($buffer); 
         if ($partial_content) $data_size = intval($range[1]) - intval($range[0]); 
         else $data_size = $file_size; 
         fclose($handle); 
         
         // send the headers and data 
         header("Content-Length: " . $data_size); 
         header("Content-md5: " . $md5_sum); 
         header("Accept-Ranges: bytes");    
         if ($partial_content) header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $file_size); 
         header("Connection: close"); 
         header("Content-type: " . $ctype); 
         header('Content-Disposition: attachment; filename=' . $file_name); 
         echo $buffer; 
         flush(); 
     } 
    ?>

    Quelle: http://php.net/manual/de/function.fread.php

    Liebe Grüße
  6. Autor dieses Themas

    voloya

    voloya hat kostenlosen Webspace.

    Hallo :wave:

    ggamee schrieb:
    Ich bin mal so frei und Verweise auf diesen Code:
    Quelle: http://php.net/manual/de/function.fread.php

    Liebe Grüße


    Vielen Dank, das Script gibt jedoch eine 404-Meldung aus (also dass die Datei angeblich nicht existiert), wenn ich diese if()-Bedingung abstelle bekomme ich eine Datei, die 0 byte groß ist.

    Es handelte sich auch um eine .avi-Datei (der Typ ist ja deklariert in dem Script). Die Datei existiert auf jeden Fall, ich kann sie auch mit "wget" auf den Server laden.

    mfg :wave:
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Könnte die Ausführungszeit des PHP-Scripts zu kurz eingestellt sein weil es immer abbricht? Hast du da schonmal nachgeschaut?
  8. g****e

    Na jetzt wirds spannend, kannst du PHP?^^
    Ich bin nicht so begeistert davon, anderen immer alles vor zu machen, darum habe ich auch nicht mehr als diese Funktion gepostet.

    So, du möchtest Datein von einem FREMDEN Server runterladen. Das wird mit dieser Funktion niemals gehen. Grund ist, dass du mit file_exists nur eigene Datein abfragen kannst, unter anderem. Meine Intention für dich war, dass du den Serverteil siehst, und jetzt in PHP einen Clienten fürs Forwarding schreibst. Weil ich im Moment wenig Zeit habe, und mich damit nicht so gut auskenne, geb ich noch ein paar Hinweise, dann kann ich gleich beruhigt mich wieder lernen setzen.

    Schau dir mal über ein geeignetes Tool (gibt es Firefox Plugins für) Die Headerkommunikation an, welche du erzeugst, wenn du ein lokales File versuchst runter zu laden. Also von deinem jetzigen Server selbst. Dann wird dir auffallen, dass jedes mal wieder ein neues Segment angefragt werden dürfte. Wenn du nun also diese Segmentnachfrage auf deinen Externen Server übersetzt, dann kannst du diese Segmente Forwarden. Vorraussetzung dafür ist, dass dein Server das auch kann, wo der Film liegt. Kann er das nicht, geht das ganze sowieso nicht. Dann müsstest du die *.avi Datei auf dem gleichen Server lagern.

    Ich hoffe du kannst mit der Instruktion etwas anfangen. Andernfalls musst du sie tatsächlich selbst buffern auf deinem Server, und das geht dann nur durch selbst runterladen auf deinen Server, und das ist nicht so toll.

    Denk weiterhin dran, Lima-City ist zwar ein Freehoster, und könnte als Proxy für ein solches genutzt werden, aber es ist nicht im Sinne des Fair-Use Prinzips, das schauen ist und bleibt auch weiterhin illegal wenn es sich um illegale Filme handelt, und ohne Schnittstellen auf dem Lagerhost, wirst du so des nicht ohne weiteres schaffen denk ich.

    Liebe Grüße
  9. Autor dieses Themas

    voloya

    voloya hat kostenlosen Webspace.

    Hallo :wave:

    ggamee schrieb:
    Na jetzt wirds spannend, kannst du PHP?^^
    Ich bin nicht so begeistert davon, anderen immer alles vor zu machen, darum habe ich auch nicht mehr als diese Funktion gepostet.

    Naja, so Arrays, Schleifen etc. sind kein Problem, hier weiß ich halt nicht einmal wie ich anfangen soll.

    ggamee schrieb:
    So, du möchtest Datein von einem FREMDEN Server runterladen. Das wird mit dieser Funktion niemals gehen. Grund ist, dass du mit file_exists nur eigene Datein abfragen kannst, unter anderem. Meine Intention für dich war, dass du den Serverteil siehst, und jetzt in PHP einen Clienten fürs Forwarding schreibst. Weil ich im Moment wenig Zeit habe, und mich damit nicht so gut auskenne, geb ich noch ein paar Hinweise, dann kann ich gleich beruhigt mich wieder lernen setzen.

    Das mit file_exists habe ich ja dann gemerkt :P Warum ich es nicht wusste? Ganz einfach, ich habe noch nie eine Datei auf einem anderen Server angesprochen, außer mit get_contents().

    ggamee schrieb:
    Schau dir mal über ein geeignetes Tool (gibt es Firefox Plugins für) Die Headerkommunikation an, welche du erzeugst, wenn du ein lokales File versuchst runter zu laden. Also von deinem jetzigen Server selbst. Dann wird dir auffallen, dass jedes mal wieder ein neues Segment angefragt werden dürfte. Wenn du nun also diese Segmentnachfrage auf deinen Externen Server übersetzt, dann kannst du diese Segmente Forwarden. Vorraussetzung dafür ist, dass dein Server das auch kann, wo der Film liegt. Kann er das nicht, geht das ganze sowieso nicht. Dann müsstest du die *.avi Datei auf dem gleichen Server lagern.

    Ja, der Server unterstützt das. Zumindest dieses Script:
    <?php 
    $file = 'http://download.lima-city.de/XXX/XXX.XXX';
    
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.end(explode('/', parse_url($file, PHP_URL_PATH))));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    
    ob_clean();
    flush();
    readfile($file);
    exit;
    ?>

    Quelle: Link 1. post bzw. php.net

    ... funktioniert ja auch, bloß lädt es eben nur ~1MB und bricht dann ab. Wenn buffering aktiviert ist dann hängt sich zusätzlich noch lighttpd auf.

    ggamee schrieb:
    Ich hoffe du kannst mit der Instruktion etwas anfangen. Andernfalls musst du sie tatsächlich selbst buffern auf deinem Server, und das geht dann nur durch selbst runterladen auf deinen Server, und das ist nicht so toll.

    Denk weiterhin dran, Lima-City ist zwar ein Freehoster, und könnte als Proxy für ein solches genutzt werden, aber es ist nicht im Sinne des Fair-Use Prinzips, das schauen ist und bleibt auch weiterhin illegal wenn es sich um illegale Filme handelt, und ohne Schnittstellen auf dem Lagerhost, wirst du so des nicht ohne weiteres schaffen denk ich.

    :wow: was für Vermutungen.
    Es handelt sich um Filme lizenziert nach Creative Commons. Ich sitze hier auf mehreren Servern und würde gerne über die interne IP-Adresse die Filme ansprechen und weiterleiten (aus Trafficgründen).

    Ich verlange ja nicht, dass mir jemand gleich etwas ganz neu schreibt, ich las lediglich, dass so etwas *anscheinend* für größere Dateien mit fopen realisiert wird (?). Nochmal: Der Code funktioniert, er bricht bloß immer nach 1 MB ab. Mir würde es also schon genügen wenn mir jemand sagen kann, woran das liegen könnte.

    mfg :wave:

  10. g****e

    voloya schrieb:
    Nochmal: Der Code funktioniert, er bricht bloß immer nach 1 MB ab. Mir würde es also schon genügen wenn mir jemand sagen kann, woran das liegen könnte.

    Wurde schon beantwortet, siehe hier:
    hackyourlife schrieb:
    Könnte die Ausführungszeit des PHP-Scripts zu kurz eingestellt sein weil es immer abbricht? Hast du da schonmal nachgeschaut?

    Wenn du eine Executiontime von 15 Sek hast, dann läd der Server ganze 15 Sek runter. Darin dann noch Latenzen usw, dann hast du nur wenig runtergeladen, und das Script wird beendet.

    Liebe Grüße
  11. Autor dieses Themas

    voloya

    voloya hat kostenlosen Webspace.

    Hallo :wave:

    ggamee schrieb:
    voloya schrieb:
    Nochmal: Der Code funktioniert, er bricht bloß immer nach 1 MB ab. Mir würde es also schon genügen wenn mir jemand sagen kann, woran das liegen könnte.

    Wurde schon beantwortet, siehe hier:
    hackyourlife schrieb:
    Könnte die Ausführungszeit des PHP-Scripts zu kurz eingestellt sein weil es immer abbricht? Hast du da schonmal nachgeschaut?

    Wenn du eine Executiontime von 15 Sek hast, dann läd der Server ganze 15 Sek runter. Darin dann noch Latenzen usw, dann hast du nur wenig runtergeladen, und das Script wird beendet.


    Achso darauf habe ich vergessen zu antworten. Eine höhere Executiontime bewirkt gar nix, die war auf 30, der Download bricht aber nach ~3 Sekunden schon ab. Auch ein Erhöhen auf 300 hat keine Veränderung gebracht.

    mfg :wave:
  12. m******e

    Hm, war die Lösung nicht schon nachzulesen, oder stehe ich auf dem Schlauch? :tongue:

    Warnung

    Wenn aus etwas gelesen werden soll, was keine normale lokale Datei ist,
    wie etwa Streams von entfernten Dateien oder von popen() und fsockopen(),
    so wird das Lesen beendet sobald ein Paket verfügbar ist.
    Das bedeutet, dass man die Daten in Stücken sammeln muss
    .
    Dies wird im unteren Beispiel gezeigt.

    <?php
    // Für PHP5 und höher
    $handle = fopen("http://www.example.com/", "rb");
    $contents = stream_get_contents($handle);
    fclose($handle);
    ?>

    <?php
    $handle = fopen("http://www.example.com/", "rb");
    $contents = '';
    while (!feof($handle)) {
      $contents .= fread($handle, 8192);
    }
    fclose($handle);
    ?>

    Quelle
    http://php.net/manual/de/function.fread.php (Beispiel #3 fread()-Beispiele für entfernte Dateien)
  13. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Du solltest aber die Datei nicht erst in eine Variable laden, da so zu viel Speicher verbraucht und das Script mit einer Fehlermeldung abbrechen würde.
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!