【问题标题】:PHP getimagesize - Failed to open stream. Bad requestPHP getimagesize - 无法打开流。错误的请求
【发布时间】:2016-12-22 21:19:17
【问题描述】:

我收到以下错误:

getimagesize(https://static1.squarespace.com/static/570d03d02b8dde8b2642afca/570f74e87c65e4819dec6812/57272dbfb6aa606f78a5d8b5/1470397291105/4XTRYCK3.jpg):打开流失败:HTTP 请求失败! HTTP/1.1 400 错误请求

图像在我的浏览器中打开时没有问题。

有人知道为什么会失败吗?

【问题讨论】:

  • this post 可能会为您提供一些帮助
  • 这太奇怪了。我刚刚再次测试,现在 URL 有效(HTTP 和 HTTPS)。但我尝试了另一个类似的,它再次以相同的方式失败,对于 HTTP 和 HTTPS。例如:static1.squarespace.com/static/570d03d02b8dde8b2642afca/…
  • @dpp 另外,不幸的是,您提到的帖子中的解决方案似乎以同样的方式失败。
  • 想过目标服务器是否以某种方式阻止抓取,但this solution 也不起作用,仍然是错误的请求。
  • 现在确信目标服务器正在阻止我的客户端,因为它正在使用某些用户代理标头。尝试使用 curl 连接并编辑标题以使其看起来像 Firefox 网络浏览器,然后我通过了。但是遇到了其他错误。似乎这里不可能有一个简单的解决方案,理想情况下我想编辑 getimagesize() 的用户代理标头。

标签: php gd getimagesize


【解决方案1】:

Squarespace 拒绝任何 User-Agent 标头不是 Web 浏览器的连接。这包括 CURL 和 getimagesize。

您可以通过将其插入代码来设置用户代理标头:

ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)');

【讨论】:

  • 这解决了我的问题!此外,服务器似乎记住/缓存了一个有效的用户代理。当我第一次运行 getimagesize 而没有上面的 ini_set 时,它会像它应该的那样阻塞,当我运行 getimagesize 和上面的 ini_set 时,它可以工作,最后有趣的是,当我再次关闭 ini_set 时,getimagesize 仍然可以工作几天/几小时(不是当然),直到它恢复到原来的错误。谁能解释一下?不过不重要,只是好奇。
【解决方案2】:

就我而言(显然与基于其 URL 的 OP 不同)存在两个问题。

首先是我得到的 URL 是 HTTP,但浏览器会成功重定向到 HTTPS,而我的 getimagesize() 会因给定错误而失败。我必须在我的 URL 中将“http”替换为“https”。

$url = "http://test.com/file name.jpg";
$url = preg_replace('/^http:/', 'https:', $url);

第二个是给我的网址中有一个空格。我必须将空间编码为 %20。

$url = (dirname($url) . '/'. rawurlencode(basename($url)));
Final URL: https://test.com/file%20name.jpg

通过这两个替换,对 getimagesize() 的调用成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2015-10-08
    • 2011-12-26
    • 2012-07-26
    • 2011-05-31
    • 2012-12-31
    相关资源
    最近更新 更多