Ankündigung

Einklappen
Keine Ankündigung bisher.

Datei zeitgleich herunterladen und weiterleiten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datei zeitgleich herunterladen und weiterleiten

    Hallo zusammen,

    zum Hintergrund:
    Ich habe einen Handyvertrag, der mich beim Surfen auf die Ports 80 und 443, also http und https, limitiert. Da ich per Netbook auch Dateien z.B. von ftp-Servern laden möchte, will ich ein PHP-Skript schreiben.

    Letztlich soll durch einen Aufruf von
    Code:
    http://abc.de/download.php?file=ftp://xyz.de/meins.zip
    dann die Datei
    Code:
    ftp://xyz.de/meins.zip
    vom Skript eingelesen werden, jedoch nicht auf der Festplatte erstmal komplett zwischengespeichert werden, sondern die noch nicht fertig heruntergeladene Datei soll direkt vom Link-Öffner geladen werden.

    Bis jetzt hab ich nur
    PHP-Code:
    file_get_contents() 
    für mein Vorhaben gefunden. Ich suche also noch nach einer Funktion (oder ein Gedankenanstoß) zum Öffnen einer Datei, die noch nicht fertig ist und die auch solange eingelesen wird, bis sie fertig heruntergeladen und auch wieder hochgeladen wird (zu meinem Netbook).

    Es ist zudem wichtig, dass nicht eine Art FXP betrieben wird, wo einfach dem Zielserver gesagt wird, wer der wirkliche Empfänger ist, sondern dann die Datei bis zum Abschluss des Downloads erhalten bleibt und dann gelöscht wird; also dass der Absender auch der Server ist, an den der Request gestellt wurde.

    Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt. Bei Fragen, fragen

    Gruß,
    tobo

  • #2
    [MAN]curl[/MAN]
    "Dummheit redet viel..Klugheit denkt und schweigt.." [Amgervinus]

    Kommentar


    • #3
      Zitat von Destruction Beitrag anzeigen
      [MAN]curl[/MAN]
      Das bringt mich erstmal nicht weiter. Zum einen läuft der Server unter Windows ohne mitkompiliertes cUrl und zum anderen seh ich nicht, wie ich mein Vorhaben (Upload des file während Download noch läuft) damit umsetzen kann.

      Meine Idee sieht jetzt erstmal so aus, dass ich mir ein kleines JavaProgramm schreibe, welches mit passthru() und dem zu saugenden Link als Parameter aufgerufen wird. Damit auch der Upload möglich ist bevor der Download fertig ist, soll der Download in Chunks passieren. Ist ein partieller Download wirklich sinnvoll?

      Und macht es Sinn für das Senden der Datei an mich als Client eher eine Socket-Verbindung aufzubauen oder würde das auch mit nem einfachen readfile() gehen? Was meint ihr?

      Gruß,
      tobo

      Kommentar


      • #4
        Fertig mit dem Skript

        Soo... habs jetzt ohne CUrl hinbekommen.

        Das ganze kann jetzt auch als PHP download proxy genommen werden für Server, die keine Authentifizierung über POST, Cookies oder HTTP AUTH erfordern. GET funktioniert.

        Hier der Code:
        PHP-Code:
        <?php
        /*
         * Download script to download files 
         *   - over the internet from your lan while running lan-servers 
         *             that are not accessable over the internet.
         *   - that are using other protocols (i.e. ftp, whitch is port 21)
         *             if you have a port limit.
         *   - anonymously; only the ip running this script will be left 
         *             as trace.
         */

        // define the size of the packages send to the client
        define('PACKAGE_SIZE'8192);

        // set $file you want to download
        if (isset($_GET["dl"])) {
            
        $file $_GET["dl"];
        }
        else {
            
        $file "http://speedtest.qsc.de/10GB.qsc"// test file
        }

        // Generate the server headers
        if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
            
        header('Content-Type: "application/octet-stream"');
            
        header('Content-Disposition: attachment; filename="'.basename($file).'"');
            
        header('Expires: 0');
            
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            
        header("Content-Transfer-Encoding: binary");
            
        header('Pragma: public');
            
        header("Content-Length: ".remote_file_size($file));
        }
        else {
            
        header('Content-Type: "application/octet-stream"');
            
        header('Content-Disposition: attachment; filename="'.basename($file).'"');
            
        header("Content-Transfer-Encoding: binary");
            
        header('Expires: 0');
            
        header('Pragma: no-cache');
            
        header("Content-Length: ".remote_file_size($file));
        }

        // open remote file in read byte mode
        $fp fopen($file"rb");

        // loop while there is data remaining in $file
        while($chunk fread($fpPACKAGE_SIZE))
        {
            
        // output data
            
        print $chunk;
            
        flush();
            
        ob_flush();
            unset(
        $chunk);
        }
        fclose($fp);
        exit();

        /**
         * Modded remote_file_size to get file size of files bigger 2 GB;
         * original code from http://snippets.dzone.com/posts/show/1207
         */

        function remote_file_size ($url){ 
            
        $head ""
            
        $url_p parse_url($url); 
            
        $host $url_p["host"]; 
            if(!
        preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$host)){
                
        // a domain name was given, not an IP
                
        $ip=gethostbyname($host);
                if(!
        preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$ip)){
                    
        //domain could not be resolved
                    
        return -1;
                }
            }
            
        $port intval($url_p["port"]); 
            if(!
        $port$port=80;
            
        $path $url_p["path"]; 
            
        //echo "Getting " . $host . ":" . $port . $path . " ...";

            
        $fp fsockopen($host$port$errno$errstr20); 
            if(!
        $fp) { 
                return 
        false
                } else { 
                
        fputs($fp"HEAD "  $url  " HTTP/1.1\r\n"); 
                
        fputs($fp"HOST: " $host "\r\n"); 
                
        fputs($fp"User-Agent: http://www.example.com/my_application\r\n");
                
        fputs($fp"Connection: close\r\n\r\n"); 
                
        $headers ""
                while (!
        feof($fp)) { 
                    
        $headers .= fgets ($fp128); 
                    } 
                } 
            
        fclose ($fp); 
            
        //echo $errno .": " . $errstr . "<br />";
            
        $return = -2
            
        $arr_headers explode("\n"$headers); 
            
        // echo "HTTP headers for <a href='" . $url . "'>..." . substr($url,strlen($url)-20). "</a>:";
            // echo "<div class='http_headers'>";
            
        foreach($arr_headers as $header) { 
                
        // if (trim($header)) echo trim($header) . "<br />";
                
        $s1 "HTTP/1.1"
                
        $s2 "Content-Length: "
                
        $s3 "Location: "
                if(
        substr(strtolower ($header), 0strlen($s1)) == strtolower($s1)) $status substr($headerstrlen($s1)); 
                if(
        substr(strtolower ($header), 0strlen($s2)) == strtolower($s2)) $size   substr($headerstrlen($s2));  
                if(
        substr(strtolower ($header), 0strlen($s3)) == strtolower($s3)) $newurl substr($headerstrlen($s3));  
            } 
            
        // echo "</div>";
            
        if(intval($size) > 0) {
                
        $return=strval($size);
            } else {
                
        $return=$status;
            }
            
        // echo intval($status) .": [" . $newurl . "]<br />";
            
        if (intval($status)==302 && strlen($newurl) > 0) {
                
        // 302 redirect: get HTTP HEAD of new URL
                
        $return=remote_file_size($newurl);
            }
            return 
        $return

        ?>
        Gruß,
        Tobo

        PS: CUrl wäre wohl auch möglich gewesen, wie ich gesehen hab auch unter Windows

        Kommentar

        Lädt...
        X