2010-09-03 4 views
1

Je veux télécharger n'importe quel fichier de n'importe quel site Web avec mon script de téléchargement forcé. script simple qui invite simplement une fenêtre de téléchargement pour enregistrer le fichier sur le bureau. Je passe simplement? Path = http://www.google.com/images/whatever/file.jpg à l'URL et le script déclenche le téléchargement.Télécharger des fichiers à partir de n'importe quelle page! vérifier si le fichier est illisible?

Cependant, ce script ne fonctionne bien sûr pas pour chaque page. La plupart du temps, je n'ai pas les permissions pour le faire!

La requête HTTP a échoué! HTTP/1.0 403 Interdit dans ....

Existe-t-il une méthode permettant de vérifier si le téléchargement forcé de certains domaines fonctionne ou non? Comme is_readable() ou quelque chose.

concernant mat

modifier:

<?php 
    error_reporting(E_ALL); 

    if(isset($_GET['p'])) $path = $_GET['p']; 
    else header('Location:' . 'mypage'); 

    $file = $path; 
    //header('Location:' . $file); 
    // 
    header("Cache-Control: no-cache"); 
    header("Expires: -1"); 
    header("Content-Type: application/octet-stream;"); 
    header("Content-Disposition: attachment; filename=\"" . basename($file) . "\";"); 
    header("Content-Transfer-Encoding: binary"); 
    //header("Content-Length: " . filesize($file)); 
    //echo file_get_contents($file); 
    echo readfile($file); 
    ?> 
+0

édité là-haut! Je ne suis même pas sûr s'il est possible de télécharger n'importe quel fichier de n'importe quel serveur avec un script php. ce serait mon but. J'aimerais passer n'importe quelle URL (qui pointe vers n'importe quel fichier) comme par ex. http://goblueridgecard.com/blog/files/2008/04/blue-ridge-flower.jpg et mon script affiche une fenêtre de téléchargement et l'enregistre correctement sur le bureau. est-ce possible? Par exemple, je veux saisir l'URL de l'image d'une image facebook, la transmettre à mon script et l'image est téléchargée sur mon disque dur. – matt

+0

Ma réponse répond directement à votre question. Utilisez ma classe WebPage généreusement fournie et il vérifiera que l'URL est légitime, téléchargera l'élément et vous donnera le cadre pour déterminer * facilement * s'il est interdit. –

Répondre

1

J'ai créé cette classe pour mon projet de compte de mots mediawiki.

// Copyright PHPExperts.pro 
// License: Any user on Stackflow may use this code under the BSD License. 

/** 
* Web page datatype that holds all the various parts 
* and info about a web page. 
*/ 
class WebPage 
{ 
    public $url; 
    public $headers; 
    public $body; 
    public $text; 


    public function __construct($url) 
    { 
     // 1. Bail out now if the CURL extension is not loaded. 
     if (!in_array('curl', get_loaded_extensions())) 
     { 
      throw new Exception(WebPageException::MISSING_CURL); 
     } 

     // 2. Make sure the URL is valid. 
     self::ensureValidURL($url); 

     // 3. Store the URL. 
     $this->url = $url; 
    } 

    /** 
    * Determine if a URL is valid. 
    * 
    * @param string $url 
    * @returns true if the URL is a string and is a valid URL. False, otherwise. 
    */ 
    public static function isURLValid($url) 
    { 
     return (is_string($url) && 
       filter_var($url, FILTER_VALIDATE_URL) !== false); 
    } 

    public static function ensureValidURL($url) 
    { 
     if (!self::isURLValid($url)) 
     { 
      throw new WebPageException(WebPageException::INVALID_URL, array($url)); 
     } 
    } 

    // captureHeader() donated by [email protected], 
    // via http://us.php.net/curl_setopt_array 
    private function captureHeader($ch, $header) 
    { 
     $this->headers[] = $header; 
     return strlen($header); 
    } 

    public function fetchURL() 
    { 
     $ch = curl_init(); 
     curl_setopt_array($ch, array(CURLOPT_URL => $this->url, 
            CURLOPT_RETURNTRANSFER => 1, 
            CURLOPT_HEADERFUNCTION => array($this, 'captureHeader'), 
            CURLOPT_TIMEOUT => 5, 
            ) 
         ); 

     $data = curl_exec($ch); 
     curl_close($ch); 

     if ($data === false || is_null($data) || $data == '') 
     { 
      throw new WebPageException(WebPageException::BLANK_URL, array($this->url)); 

     } 

     // TODO: Need to handle HTTP error messages, such as 404 and 502. 
     $this->body = $data; 
       // Uses code from [email protected] 
       $this->text = remove_HTML($data); 
    } 
} 

Après avoir exécuté WebPage::captureHeader() vous puis juste foreach par $this->headers, et si vous ne trouvez pas HTTP/1.0 403 Forbidden, vous êtes bon pour aller. Ceci répond complètement à votre question, donc j'attends crédit.

3

Si votre script utilise boucle pour télécharger le fichier, vous pouvez utiliser curl_getinfo et vérifier la CURLINFO_HTTP_CODE avant de passer le fichier à l'utilisateur.

Questions connexes