无法将图像从外部URL复制到我的服务器

时间:2015-02-19 08:49:46

标签: php mysql curl fopen file-get-contents

我试图将一堆图像文件链接存储在mysql数据中,从一台服务器复制到另一台服务器,有点像在后台运行的cron作业,它检查外部链接并将其复制到服务器。手动查看时显示的链接很少但当我尝试通过php代码复制文件时没有任何反应。它只输出空字符串。

以下是我尝试复制到服务器的几个链接。

  1. http://crm.propspace.com/watermark?c_id=1646&l_id=2300187&aid=1444765&id=14181282100524636&image=09_12_2014-16_53_34-1646-b15d08432d253ac710dc7bea47bf67c9.png
  2. http://crm.propspace.com/watermark?c_id=1646&l_id=2257894&aid=1444765&id=14169037278702926&image=25_11_2014-12_29_24-1646-67974878d8b7abd86d86c93527e15ebd.jpg
  3. http://crm.propspace.com/watermark?c_id=1646&l_id=2257894&aid=1444765&id=14169037278702926&image=25_11_2014-12_29_31-1646-0cf46efe5b2f89214001a2e050353736.jpg
  4. http://crm.propspace.com/watermark?c_id=1646&l_id=2282465&aid=1444765&id=14176053840492751&image=03_12_2014-16_36_29-1646-46cd5f89122e6899f8185e20bd942dd7.png
  5. 链接打开并显示图像,但是当我尝试通过php代码复制时,我只得到空数据。我尝试了所有类型的方法来复制图像,如

    1. copy()
    2. fopen()
    3. file_get_contents()
    4. curl_init()
    

    但一切都以空字符串或数据结束。任何人都可以帮我解决这个问题。

    用于检索图像文件的方法

    $img_link       =   "image from link";
    $upload_link    =   "image to save link";
    
    
    Method 1
    ------------------------------------------------------------------------------
    $img_cont       =   file_get_contents($img_link);
    file_put_contents($upload_link, $img_cont);
    
    
    
    Method 2 - (This method gives me an image with 0 bytes)
    ------------------------------------------------------------------------------
    copy($img_link, $upload_link);
    
    
    Method 3
    ------------------------------------------------------------------------------
    $img_file   =   fopen($img_link, 'r');
    $img_data   =   '';
    while($chunk = fread($img_file, 8192))
    $img_data   .=  $chunk;
    fclose($img_file);
    
    
    Method 4
    ------------------------------------------------------------------------------
    $img_stream =   fopen($img_link, 'r');
    $img_data   =   stream_get_contents($img_stream);
    fclose($img_stream);
    
    
    Method 5
    ------------------------------------------------------------------------------
    $referer    =   "http://www.propspace.com/"
    $headers    =   array(
        'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg, image/png',
        'Connection: Keep-Alive',
        'Content-type: application/x-www-form-urlencoded;charset=UTF-8'
    );
    
    // Initialize cURL Connection
    $conn           =   curl_init();
    
    // Set cURL Options
    curl_setopt($conn, CURLOPT_URL, $img_link);
    
    // Add Headers
    if(is_array($headers) && count($headers) > 0){
        curl_setopt($conn, CURLOPT_HTTPHEADER, $headers);
    }
    
    // Add References
    if($reference != "")
    curl_setopt($conn, CURLOPT_REFERER, $reference);
    
    // Other Options
    curl_setopt($conn, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($conn, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($conn, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($conn, CURLOPT_FAILONERROR, true);
    curl_setopt($conn, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($conn, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($conn, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
    curl_setopt($conn, CURLOPT_HEADER, 0);
    curl_setopt($conn, CURLOPT_FOLLOWLOCATION, 1);
    
    // Execute Request
    $img_cont       =   curl_exec($conn);
    

    谢谢。

      

    更新:刚刚发现一个让图像显示0大小的东西。它只能从迪拜或阿联酋网络访问。我怎么能让它工作呢?

3 个答案:

答案 0 :(得分:0)

您尝试下载只有在正确登录后才能访问的通用图像。你必须登录"登录"与您的服务器,然后您可能能够这样做。我用cURL做了一次。

答案 1 :(得分:0)

那可能有很多原因。你有没有得到任何警告/错误? 也许" allow_url_fopen"在你的php.ini中设置为" off"

你能提供一些示例代码吗?

答案 2 :(得分:0)

我使用此方法复制外部图像

public function update_pics($url)
    {

            $image_array=explode('/',$url);
            if($image_array[0]!='http:')
            {
                $url='http:'.$url;
            }
              $image_name=strtolower($image_array[count($image_array)-1]);
            $supported_image = array(
                'gif',
                'jpg',
                'jpeg',
                'png'
            );
            $ext = strtolower(pathinfo($image_name, PATHINFO_EXTENSION));
            if (!in_array($ext, $supported_image)) {
                $image_name=$image_name.'.jpg';
            } 
            if(copy($url, './uploads/'.$image_name))
            {

                $target = 'uploads/';
                $config['image_library'] = 'gd2';
                $config['source_image'] = $target.$image_name;
                $config['create_thumb'] = FALSE;
                $config['maintain_ratio'] = FALSE;
                $config['width'] = $width;
                $config['height'] = $height;    
                $config['new_image'] = $target.$image_name;     
                $this->load->library('image_lib', $config);
                $this->image_lib->initialize($config); 
                $this->image_lib->resize();
                $this->image_lib->clear();
            }       
    }