PHP文件输出内容:无法打开流:协议错误


PHP file_put_contents: failed to open stream: Protocol error

使用PHP副本或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');

这种情况只发生在某些时候,只发生在一些照片上。

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

这一行出现错误

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

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

这种情况只发生在某些时候,只发生在一些照片上。

我怀疑这取决于你收到的谷歌参考字符串。长度可能变化很大,所以确实会有所不同。


请参阅2018年5月31日起的微软命名文件、路径和命名空间:

例如,保留字符(来自命名约定)

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

来自维基百科的文章文件名,章节长度限制:

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

维基百科上的文章"文件系统的比较"包含了一个有用的表"限制"。

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

 maximum_execution_time = 120
 memory_limit = 250M

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

我的代码一直指向像K:''F''Users''rcwalsh''Documents''code''blahblah''这样的文件夹。

我需要把它改成/home/vagrant/Code/blahblah

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