使用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');
这种情况有时只会发生,仅适用于某些照片。
答案 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
。