fopen() et demander le téléchargement

Eléphanteau du PHP | 21 Messages

10 déc. 2012, 19:02

Bonjour,

J'ai trouvé cet exemple de script sur la doc PHP :
<?php 
#usage: 
$r = new HTTPRequest('notrefichier.com/test.zip'); 
echo $r->DownloadToString(); 

class HTTPRequest 
{ 
    var $_fp;        // HTTP socket 
    var $_url;        // full URL 
    var $_host;        // HTTP host 
    var $_protocol;    // protocol (HTTP/HTTPS) 
    var $_uri;        // request URI 
    var $_port;        // port 
    
    // scan url 
    function _scan_url() 
    { 
        $req = $this->_url; 
        
        $pos = strpos($req, '://'); 
        $this->_protocol = strtolower(substr($req, 0, $pos)); 
        
        $req = substr($req, $pos+3); 
        $pos = strpos($req, '/'); 
        if($pos === false) 
            $pos = strlen($req); 
        $host = substr($req, 0, $pos); 
        
        if(strpos($host, ':') !== false) 
        { 
            list($this->_host, $this->_port) = explode(':', $host); 
        } 
        else 
        { 
            $this->_host = $host; 
            $this->_port = ($this->_protocol == 'https') ? 443 : 80; 
        } 
        
        $this->_uri = substr($req, $pos); 
        if($this->_uri == '') 
            $this->_uri = '/'; 
    } 
    
    // constructor 
    function HTTPRequest($url) 
    { 
        $this->_url = $url; 
        $this->_scan_url(); 
    } 
    
    // download URL to string 
    function DownloadToString() 
    { 
        $crlf = "\r\n"; 
        
        // generate request 
        $req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf 
            .    'Host: ' . $this->_host . $crlf 
            .    $crlf; 
        
        // fetch 
        $this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://' : '') . $this->_host, $this->_port); 
        fwrite($this->_fp, $req); 
        while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp)) 
            $response .= fread($this->_fp, 1024); 
        fclose($this->_fp); 
        
        // split header and body 
        $pos = strpos($response, $crlf . $crlf); 
        if($pos === false) 
            return($response); 
        $header = substr($response, 0, $pos); 
        $body = substr($response, $pos + 2 * strlen($crlf)); 
        
        // parse headers 
        $headers = array(); 
        $lines = explode($crlf, $header); 
        foreach($lines as $line) 
            if(($pos = strpos($line, ':')) !== false) 
                $headers[strtolower(trim(substr($line, 0, $pos)))] = trim(substr($line, $pos+1)); 
        
        // redirection? 
        if(isset($headers['location'])) 
        { 
            $http = new HTTPRequest($headers['location']); 
            return($http->DownloadToString($http)); 
        } 
        else 
        { 
            return($body); 
        } 
    } 
} 
?>
Le script fonctionne : malheureusement, il m'affiche le contenu du zip ( enfin, le même contenu que si on l'ouvrait avec notepad par exemple ) dans le navigateur.
Comment le modifier afin qu'il me propose de télécharger le fichier "notrefichier.com/test.zip" en utilisant mon serveur ( via l'IP du serveur, et pas la mienne ) ?

Cordialement,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 déc. 2012, 22:38

salut,

Tu demande l'affichage (echo $r->DownloadToString(); )

Si tu veux envoyer le fichier au navigateur tu n'as pas besoin de tous cela, le fichier est sur ton serveur, tu utilise simplement readfile et la fonction header.

Tu as un exemple dans la doc de la fonction header :mrgreen:


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 21 Messages

10 déc. 2012, 22:55

nope! le fichier est distant!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 déc. 2012, 23:30

Distant : c'est pas ce qu'indique ton code ^^

Cela ne change rien si tu veux envoyer ton fichier au navigateur utilise header après l'avoir récupéré dans une variable (la méthode retourne une chaîne donc tu peux l'avoir dans une variable sans problème).



@+
Il en faut peu pour être heureux ......