Page 1 sur 1

fopen() et demander le téléchargement

Posté : 10 déc. 2012, 19:02
par ABodyWithAHead
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,

Re: fopen() et demander le téléchargement

Posté : 10 déc. 2012, 22:38
par moogli
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:


@+

Re: fopen() et demander le téléchargement

Posté : 10 déc. 2012, 22:55
par ABodyWithAHead
nope! le fichier est distant!

Re: fopen() et demander le téléchargement

Posté : 10 déc. 2012, 23:30
par moogli
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).



@+