2010-09-03 89 views
1

我想用我的强制下载脚本从任何网站下载任何文件。简单的脚本,它只是提示下载窗口将文件保存到桌面。我只是将?path = http://www.google.com/images/whatever/file.jpg传递给url,脚本触发下载。强制从任何页面下载文件!检查文件是否可读?

但是,该脚本当然不适用于每个页面。大多数时候我没有权限这么做!

HTTP请求失败! HTTP/1.0 403禁止在...

是否有一种方法,我可以检查是否强制从某个域下载工作与否。 像is_readable()什么的。

问候亚光

编辑:

<?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

编辑在那里!我甚至不确定是否可以使用php脚本从任何服务器下载任何文件。那将是我的目标。我很想只传递任何网址(指向任何文件),例如http://goblueridgecard.com/blog/files/2008/04/blue-ridge-flower.jpg和我的脚本提示下拉窗口并将其正确保存到桌面。那可能吗? 例如,我想抓住一个Facebook图像的图像URL,将它传递给我的脚本,并将图像下载到我的高清。 – matt 2010-09-03 01:09:03

+0

我的答案直接回答你的问题。使用我慷慨提供的WebPage类,它将验证该URL是否合法,下载该项目,并为您提供框架*轻松*确定它是否被禁止。 – 2010-09-03 01:16:06

回答

1

我为我的mediawiki word count项目创建了这个类。

// 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); 
    } 
} 

在运行WebPage::captureHeader()你再刚刚经历$this->headers的foreach,如果你没有找到HTTP/1.0 403禁止,你是好去。

这彻底回答你的问题,所以我期待信用。

3

如果你的脚本使用卷曲下载该文件,你可以使用curl_getinfo和文件传递到用户之前检查的CURLINFO_HTTP_CODE。