PHP file_put_contents:无法打开流:协议错误

时间:2015-02-21 19:39:21

标签: php file copy file-get-contents

使用PHP copy或file_put_contents保存图像有时会返回以下错误: 无法打开流:协议错误。

这是我尝试的工作流程:

// A. using file_get_contents and file_put_contents
$image = file_get_contents('https://maps.googleapis.com/maps/api/place/photo?key=' . $apiKey . '&photoreference=' . $mainPhoto['photo_reference'] . '&maxheight=300'

file_put_contents('googleimage/' . $mainPhoto['photo_reference'] . '.jpg', $image) // here is where the exception is thrown

// B. using copy
copy('https://maps.googleapis.com/maps/api/place/photo?key=' . $apiKey . '&photoreference=' . $mainPhoto['photo_reference'] . '&maxheight=300', 'googleimages/' . $mainPhoto['photo_reference'] . '.jpg');

这种情况有时只会发生,仅适用于某些照片。

3 个答案:

答案 0 :(得分:1)

建议的文件名不符合文件名规范时,可能会发生协议错误。例如,它包含保留字符或太长。

此行中发生错误

file_put_contents('googleimage/' . $mainPhoto['photo_reference'] . '.jpg', $image)

,并在注释中给出了$ mainPhoto ['photo_reference']可以包含的内容(以及不起作用的内容)的示例。 诚然,我没想到没有找到保留字符,所以我试图缩短它。请参阅下面的比较(我从其末尾删除了字符,直到它起作用了)。首先是原始字符串,然后是缩短的字符串。

CqQBlwAAAJMqc533H5kDibo444KqEkGjgnCWRKvmadBld3Aw_wlGom502_V3FJeg76SuGnRU77oriCREzQDZ21WtOhqT76l9ysb8aj5xWeKq7jUUTkwBZ5oWyQB7joGNca6SENMTeBY_DxGt2zrxCxouVFysg1rWaFbRA0wSMk1TGyGeY_zDFdP_I1qVp_aj5QlLFNNTpMYTNjf_YXzyTosjcAS8t5ESEMJIOAxBL1iQaOP1UH9eWxwaFH7WRElugeqGGG2srPd_wOAKvtLO
CqQBlwAAAJMqc533H5kDibo444KqEkGjgnCWRKvmadBld3Aw_wlGom502_V3FJeg76SuGnRU77oriCREzQDZ21WtOhqT76l9ysb8aj5xWeKq7jUUTkwBZ5oWyQB7joGNca6SENMTeBY_DxGt2zrxCxouVFysg1rWaFbRA0wSMk1TGyGeY_zDFdP_I1qVp_aj5QlLFNNTpMYTNjf_YXzyTosjcAS8t5ESEMJIOAxBL1iQaOP1UH9eWxwaFH7WREl

(您可以尝试一下,也可以随机地缩短字符串。但是,删除以这种方式创建的文件并不是那么容易。)

  

这仅在某些图片中有时发生。

我怀疑这取决于您收到的Google参考字符串。长度可能相差太大,以至于有所不同。


请参阅Microsoft自{2018.05.31起的Naming Files, Paths, and Namespaces

例如,保留字符(来自Naming Conventions

    < (less than)
    > (greater than)
    : (colon)
    " (double quote)
    / (forward slash)
    \ (backslash)
    | (vertical bar or pipe)
    ? (question mark)
    * (asterisk)

摘自Wikipedia的文章Filename,第Length Restrictions部分:

  

某些文件系统限制文件名的长度。

Wikipedia文章Comparison of Filesystems包含有用的表Limits

答案 1 :(得分:0)

可能有些图片太大,您需要在php.ini中增加上传容量或最长执行时间:

 maximum_execution_time = 120
 memory_limit = 250M

答案 2 :(得分:0)

我遇到了这个问题,然后我记得我的本地网站是Vagrant(Ubuntu来宾),我的主机是Windows 10。

我的代码一直指向K:\\F\\Users\\rcwalsh\\Documents\\code\\blahblah\\等文件夹。

我需要将其更改为/home/vagrant/Code/blahblah

请注意,波浪号也不起作用;我无法使用~/Code/blahblah