【问题标题】:PHP function stat(): stat failed for remote imagePHP 函数 stat():远程图像的 stat 失败
【发布时间】:2018-08-03 14:26:39
【问题描述】:

manysimilarquestionsthis,但都涉及对本地文件执行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”标头(未通过),或者卷曲图像并检索CURLINFO_CONTENT_LENGTH_DOWNLOAD 字段。同样,在 Ruby 中,我无法使用传统方法获取此图像的大小,但 Mechanize 库除外,它可以正常工作。以下是示例中图像的标题:

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==

有什么建议吗?

【问题讨论】:

    标签: php filesize stat


    【解决方案1】:

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

    从 PHP 5.0.0 开始,这个函数也可以与 一些 URL 包装器一起使用。请参阅支持的协议和包装器以确定哪些包装器支持 stat() 系列功能。

    如果您在文档中查找HTTP wrapper

    支持 stat() - 否

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

    【讨论】:

      【解决方案2】:

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

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

      只要您启用了allow_url_fopen,它就可以工作。否则,您将需要使用 cURL。

      【讨论】:

        【解决方案3】:

        您可以使用 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');
        

        【讨论】:

        • 这对我不起作用。此外,您可能希望在结束函数之前关闭 curl
        猜你喜欢
        • 2023-03-04
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 2012-01-26
        • 2020-05-27
        相关资源
        最近更新 更多