如何从php的用户下载外部链接文件

时间:2016-06-16 11:08:15

标签: php

我正在运行一个用于图像托管的网站,它具有为用户下载图像的功能,如果他们喜欢的话。但下载根本不起作用。它给我这是一个无效的图像。但我下载的大小与我在网站上的大小相同,这是我的代码,可以任何身体帮助

<?php
 function get_remote_size($url) {
       $headers = get_headers($url, 1);
       if (isset($headers['Content-Length'])) return $headers['Content-Length'];
       if (isset($headers['Content-length'])) return $headers['Content-length'];

       $c = curl_init();

       curl_setopt_array($c, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => array('User-Agent: Mozilla/5.0 (Macintosh; U;  Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3'),
       ));

       curl_exec($c);
       return curl_getinfo($c, CURLINFO_SIZE_DOWNLOAD);
  }

  $url = 'http://localhost/ds.jpg';
  $name = 'Beezfeed.jpg';
  // Fetch and serve
  function do_the_download($url,$name) {
      header('Pragma: public');     // required
      header('Expires: 0');     // no cache
      header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
      header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime($url)).' GMT');
      header('Cache-Control: private',false);
      header('Content-Type: image/jpg');
      header('Content-Disposition: attachment; filename="'.$name.'"');
      header('Content-Transfer-Encoding: binary');
      header('Content-Length: '. get_remote_size($url) );
      header('Connection: close');
      readfileChunked( $url );
  }


 if(isset($_POST["downloadfile"])) {
     do_the_download($url,$name);
 }

 function readfileChunked($filename, $retbytes=true){
     $chunksize = 1*(1024*1024);
     $buffer = '';
     $cnt = 0;
     $handle = fopen($filename, 'rb');

     if ($handle === false) {
         return false;
     }

     while (!feof($handle)) {
         $buffer = fread($handle, $chunksize);
         echo $buffer;
         ob_flush();
         flush();
         if ($retbytes) {
             $cnt += strlen($buffer);
         }
     }

     $status = fclose($handle);

     if ($retbytes && $status) {
         return $cnt; // return num. bytes delivered like readfile()  does.
     }

     return $status;
 }
       ?>
       <form method="POST">
        <input type="submit" value="DOWNLOAD FILE" name="downloadfile"/>
      </form>

我只是提供一个原始代码,没有CSS和其他东西,使网站美丽。提前致谢

1 个答案:

答案 0 :(得分:0)

要尝试两件事:

1)取出设置Last-Modified标题的行。当我尝试这个时,我从那条线上得到了一个警告,虽然在某些情况下可能会起作用。如果你真的需要修改时间,你可以通过了解实际的文件路径来获得它。

2)在die()之后添加readfileChunked( $url );。您需要阻止表单html出现在图像数据的底部。