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

Tud*_*oiu 6 php copy file 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');
Run Code Online (Sandbox Code Playgroud)

这只是有时发生,仅适用于某些图片。

Jea*_*ark 10

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

错误发生在这一行

file_put_contents('googleimage/' . $mainPhoto['photo_reference'] . '.jpg', $image)
Run Code Online (Sandbox Code Playgroud)

并在评论中举例说明了 $mainPhoto['photo_reference'] 可以包含的内容(以及无效的内容)。诚然,我没想到会找到保留字符,也没有,所以我试图缩短它。请参阅下面的比较(我从其末尾删除了字符,直到它起作用为止)。首先是原始字符串,然后是缩短的字符串。

CqQBlwAAAJMqc533H5kDibo444KqEkGjgnCWRKvmadBld3Aw_wlGom502_V3FJeg76SuGnRU77oriCREzQDZ21WtOhqT76l9ysb8aj5xWeKq7jUUTkwBZ5oWyQB7joGNca6SENMTeBY_DxGt2zrxCxouVFysg1rWaFbRA0wSMk1TGyGeY_zDFdP_I1qVp_aj5QlLFNNTpMYTNjf_YXzyTosjcAS8t5ESEMJIOAxBL1iQaOP1UH9eWxwaFH7WRElugeqGGG2srPd_wOAKvtLO
CqQBlwAAAJMqc533H5kDibo444KqEkGjgnCWRKvmadBld3Aw_wlGom502_V3FJeg76SuGnRU77oriCREzQDZ21WtOhqT76l9ysb8aj5xWeKq7jUUTkwBZ5oWyQB7joGNca6SENMTeBY_DxGt2zrxCxouVFysg1rWaFbRA0wSMk1TGyGeY_zDFdP_I1qVp_aj5QlLFNNTpMYTNjf_YXzyTosjcAS8t5ESEMJIOAxBL1iQaOP1UH9eWxwaFH7WREl
Run Code Online (Sandbox Code Playgroud)

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

这只是有时发生,仅适用于某些图片。

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


请参阅 Microsoft从 2018.05.31 开始的命名文件、路径和命名空间

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

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

来自维基百科的文章Filename,部分Length Restrictions

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

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


leo*_*old 0

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

 maximum_execution_time = 120
 memory_limit = 250M
Run Code Online (Sandbox Code Playgroud)