PHP 函数 stat():远程图像统计失败

PHP function stat(): stat failed for remote image

many to this,但都涉及对本地文件执行 stat() 或 filesize(),这不起作用,因为您需要完整路径。

这个问题是不同的,因为我有一些具有完整路径的远程图像,但我仍然无法检索它们的大小。这是一个例子:

stat("https://cdn-img.health.com/sites/default/files/1532113674/1-opener-sleep-a-z-GettyImages-485559412.jpg");

这会抛出一个错误 "stat failed"。我也无法从 filesize() 函数获取图像大小,检索 "Content-Length" 或 "X-Original-Content-Length" headers (未通过),或卷曲图像并检索CURLINFO_CONTENT_LENGTH_DOWNLOAD 字段。同样,在 Ruby 中,除了 Mechanize 库之外,我无法使用传统方法获取此图像的大小,它可以正常工作。这是示例中图像的 headers:

HTTP/1.1 200 OK
Content-Type:   image/jpeg
Transfer-Encoding:  chunked
Connection: keep-alive
Cache-Control:  max-age=1800
Date:   Fri, 03 Aug 2018 14:08:39 GMT
ETag:   "90c755-5717304f98380-gzip"
Expires:    Fri, 03 Aug 2018 14:38:39 GMT
Last-Modified:  Fri, 20 Jul 2018 19:08:22 GMT
P3P:    CP='PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PRE CUR ADMa DEVa TAIo PSAo PSDo IVAo IVDo CONo TELo OTPi OUR UNRo PUBi OTRo IND DSP CAO COR'
Server: Apache
TI-Varnish-Age: 0
Via:    1.1 varnish, 1.1 ba150248cd293ea895c35304503c9f27.cloudfront.net (CloudFront)
X-Varnish:  1920400558
Vary:   Accept-Encoding
Age:    19
X-Cache:    Hit from cloudfront
X-Amz-Cf-Id:    pKXUfsB5egUfk4Te7oxIG7TgFLoUfMSUWqGZxd5822_ejvorITbFsg==

有什么建议吗?

为了让 stat() 确定远程文件的文件大小,底层包装器需要支持 stat,来自 PHP manual:

As of PHP 5.0.0, this function can also be used with some URL wrappers. Refer to Supported Protocols and Wrappers to determine which wrappers support stat() family of functionality.

如果您在文档中查找 HTTP wrapper

Supports stat() - No

大多数将文件作为参数的函数都依赖包装器来执行远程操作,因此这些函数中的 none 将能够获取远程文件的大小。如果您可以使用该扩展程序,cURL functions 可能是您最好的选择。

您可以通过以下方式获取尺寸:

strlen(file_get_contents('http://link.of/image.jpg'));

只要您启用了 allow_url_fopen,它就会起作用。否则你将需要使用 cURL。

您可以使用 curl 来获取文件信息,比方说如果您想获取任意文件的大小 url 然后使用这个函数:

            function getFileSizeByCurl($url) {  
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_VERBOSE, 1);
                curl_setopt($ch, CURLOPT_HEADER, 1);
                $response = curl_exec($ch);
                return curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
            }


                            //Calling a function 
            echo getFileSizeByCurl('https://cdn-img.health.com/sites/default/files/1532113674/1-opener-sleep-a-z-GettyImages-485559412.jpg');