使用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
。