【问题标题】:Why file_get_contents($url) or file_get_contents(urlencode($url)) returns http request fail为什么 file_get_contents($url) 或 file_get_contents(urlencode($url)) 返回 http 请求失败
【发布时间】:2016-01-07 07:49:21
【问题描述】:

当我在 laravel 4 中使用库干预/图像时,使用一段代码 $image = Image::make($url) 我遇到错误:

file_get_contents(http://ticket.at-newyork.com/image/tenboudai/rockfeller-top.jpg): failed to open stream: HTTP request failed! HTTP/1.1 410 Gone

我研究了很多关于 stackoverflow 的解决方案并尝试过:使用 urlencode 但我有另一个错误:

file_get_contents(http%3A%2F%2Fticket.at-newyork.com%2Fimage%2Ftenboudai%2Frockfeller-top.jpg): failed to open stream: No such file or directory

请不要建议我使用 curl,因为 file_get_contents() 是库中的代码,我无法更改。谢谢

【问题讨论】:

  • 托管该图像的服务器是否阻止了盗链?
  • 我不明白,我只知道 curl 可以解决问题但我不能使用,因为它是库中的代码,所以我无法更改
  • 我刚刚尝试了 cURL 但它不起作用,它也返回 410 状态码。图像/站点的所有者阻止您像这样远程访问图像。谷歌“防止盗链”。
  • 当我改变使用 cURL 时,它完全正确,我不知道为什么在你这边它返回 410 状态码,也许这不是原因
  • at this question about cURL and images。查看@bbullis 关于用户代理检测的评论。如果我在 cURL 中设置用户代理,我会得到图像,如果没有,我会得到 410 状态。

标签: php laravel laravel-4


【解决方案1】:

域 ticket.at-newyork.com 需要用户代理标头来远程获取内容。看看下面对我有用的解决方案。

$opts = array(
    'http'=>array(
        'method'=>"GET",
        'header'=>"Host: ticket.at-newyork.com\r\n" .
            "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"
    )
);

$context = stream_context_create($opts);

$data = file_get_contents('http://ticket.at-newyork.com/image/tenboudai/rockfeller-top.jpg', false, $context);
file_put_contents('test.jpg', $data);

你也可以通过设置CURLOPT_USERAGENT来使用curl

【讨论】:

  • 您的方法无法解决我的问题,因为我无法更改库中包含函数 file_get_contents() 的文件中的任何内容,但它可以帮助我更多地了解它,非常感谢您的支持。我很感激 ! +1
  • Chetan Ameta 的代码是正确的。如果不设置这些选项,您将无法使用 file_get_contents() 获取图像文件。 header("内容类型:图片/jpeg");打印_r($数据);显示图像。
【解决方案2】:

这是我的解决方案,可以帮助解决它。而是在参数中传递 url,我在控制器中使用 cURL 来获取二进制图像数据并将其传递给参数,这是我的代码:

    curl_handle = curl_init();
    curl_setopt($curl_handle, CURLOPT_URL,$url);
    curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Vivo app');
    $query = curl_exec($curl_handle);
    curl_close($curl_handle);

    try {
        $image = Image::make($query)->save($destinationPath . $img_name);

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 2010-10-16
    • 2019-01-19
    • 2016-02-16
    • 1970-01-01
    • 2016-05-12
    • 2022-10-02
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多