【问题标题】:Corrupted image on auto download using url with curl in php在php中使用带有curl的url自动下载损坏的图像
【发布时间】:2018-11-21 04:41:45
【问题描述】:

我想从我的服务器下载图像而不点击任何东西 - 当我的 php 文件执行时它会自动下载,但问题是文件已损坏。但是,当我将 url 直接粘贴到浏览器中并下载时,它可以完美运行。那么为什么我下面的实现不起作用呢?对此有何想法?

这是我的代码:

$url_to_image = 'https://hideserver.com/axul-display/assets/ads/';
$ch = curl_init($url_to_image);
$my_save_dir = 'assets/ads/';
$filename = basename($url_to_image.'ads-id-4.gif');
$complete_save_loc = $my_save_dir . $filename;
$fp = fopen($complete_save_loc, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
curl_exec($ch);
curl_close($ch);
fclose($fp);

【问题讨论】:

  • 我尝试从挪威、瑞典和法国进行连接,hideserver.com (52.73.179.54) 的服务器拒绝端口 443(默认的 httpS 端口)上的 TCP 连接。其他人可以与该服务器通信吗?
  • @hanshenrik 对不起,我隐藏了服务器,因为它的私人服务器,我可以把服务器发给你吗?谢谢
  • 好吧,启用 CURLOPT_VERBOSE 并发布详细日志。在运行 curl_exec 之前运行 $out=fopen("php://output","wb");curl_setopt_array($ch,array(CURLOPT_VERBOSE=>1,CURLOPT_STDERR=>$out));,你会得到什么?
  • * 在 DNS 缓存中找到主机名 server***.com * 正在尝试 128.199.***.***... * 已连接到 server***.com (128.199.*** .***) 端口 80 (#0) > GET /axul-display/assets/ads/ HTTP/1.1 主机:server***.com 接受:/
  • @hanshenrik 可以给我你的邮箱,这样我就可以给你发邮件给服务器了,谢谢

标签: php url curl download


【解决方案1】:

大家好,感谢您的帮助,但我解决了自己的问题,而不是 curl 我使用了这个非常简单的代码。

$image_url = 'http://server***.com/axul-display/assets/ads/ads-id-4.gif';

file_put_contents('assets/ads/ads-id-4.gif', file_get_contents($image_url));

非常感谢大家!

【讨论】:

    【解决方案2】:

    参考php - How to force download of a file?上的答案

    使用 headers 代替 curl 调用来下载文件。

    $file_name = 'ads-id-4.gif';
    $file_url = 'https://hideserver.com/axul-display/assets/ads/' . 
    $file_name;
    header('Content-Type: application/octet-stream');
    header("Content-Transfer-Encoding: Binary");
    header("Content-disposition: attachment; filename=\"".$file_name."\"");
    readfile($file_url);
    exit;
    

    【讨论】:

    • OP 不是试图让 php 将图像输出到标准输出,OP 是试图让 php 脚本将图像保存到运行 php 的系统中。
    【解决方案3】:

    这对我有用..

     $ch = curl_init($url);
        if (in_array($type, ['jpg', 'jpeg','png'])) {
           curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_VERBOSE, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYSTATUS, false);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 400);
        curl_setopt($ch, CURLOPT_FILE, fopen($temp_path, 'wb'));
        curl_exec($ch);
        $info = curl_getinfo($ch);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多