PHP fopen 讀取帶中文URL地址的一點(diǎn)見(jiàn)解
更新時(shí)間:2012年09月25日 23:38:10 作者:
之前喜歡用fopen()函數(shù)跨域讀取圖片或其它文件,一直都沒(méi)發(fā)現(xiàn)什么問(wèn)題。我所用的PHP版本都是5的了,應(yīng)該不會(huì)有CRLF Injection攻擊危險(xiǎn)吧
但昨天在讀取一張圖片的時(shí)候出問(wèn)題了,后來(lái)發(fā)現(xiàn)是URL里帶中文字符。
例如下面這種情況:
$files = fopen('http://www.website.com/我的PP.jpg', 'rb');
那“$files”的返回值將會(huì)是“False”。首先我想到的是將URL用urlencode編碼一下,發(fā)現(xiàn)還是不行,原來(lái)urlencode會(huì)把“:”、“/”字符也編碼了,那URL就不是URL了。呵,說(shuō)得有些繞口,那就把“:”、“/”字符的編碼替換回來(lái)就應(yīng)該行的。
$url = 'http://www.website.com/我的PP.jpg';
$url = preg_replace('/\%3A/i', ':', preg_replace('/\%2F/i', '/', urlencode(urldecode($url)))); $file = fopen($url, 'rb');
試試,嘿~還真是行了。下面再溫習(xí)一下fopen()函數(shù):
fopen() 函數(shù)打開(kāi)文件或者URL。 如果打開(kāi)失敗,本函數(shù)返回FALSE。 打開(kāi)成功,本函數(shù)返回TRUE。
一、語(yǔ)法:
例如下面這種情況:
復(fù)制代碼 代碼如下:
$files = fopen('http://www.website.com/我的PP.jpg', 'rb');
那“$files”的返回值將會(huì)是“False”。首先我想到的是將URL用urlencode編碼一下,發(fā)現(xiàn)還是不行,原來(lái)urlencode會(huì)把“:”、“/”字符也編碼了,那URL就不是URL了。呵,說(shuō)得有些繞口,那就把“:”、“/”字符的編碼替換回來(lái)就應(yīng)該行的。
復(fù)制代碼 代碼如下:
$url = 'http://www.website.com/我的PP.jpg';
$url = preg_replace('/\%3A/i', ':', preg_replace('/\%2F/i', '/', urlencode(urldecode($url)))); $file = fopen($url, 'rb');
試試,嘿~還真是行了。下面再溫習(xí)一下fopen()函數(shù):
fopen() 函數(shù)打開(kāi)文件或者URL。 如果打開(kāi)失敗,本函數(shù)返回FALSE。 打開(kāi)成功,本函數(shù)返回TRUE。
一、語(yǔ)法:
復(fù)制代碼 代碼如下:
fopen(filename, mode, include_path, context)
| 參數(shù) | 描述 |
| filename | 規(guī)定要打開(kāi)的文件或 URL。 |
| mode | 規(guī)定要求到該文件/流的訪問(wèn)類型??赡艿闹狄?jiàn)下表。 |
| include_path | 如果也需要在 include_path 中檢索文件的話,可以將該參數(shù)設(shè)為 1 或 TRUE。 |
| context | 規(guī)定文件句柄的環(huán)境。Context 是可以修改流的行為的一套選項(xiàng)。 |
二、mode 參數(shù)的可能的值:
| mode | 說(shuō)明 |
| "r" | 只讀方式打開(kāi),將文件指針指向文件頭。 |
| "r+" | 讀寫方式打開(kāi),將文件指針指向文件頭。 |
| "w" | 寫入方式打開(kāi),將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。 |
| "w+" | 讀寫方式打開(kāi),將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。 |
| "a" | 寫入方式打開(kāi),將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。 |
| "a+" | 讀寫方式打開(kāi),將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。 |
| "x" | 創(chuàng)建并以寫入方式打開(kāi),將文件指針指向文件頭。如果文件已存在,則 fopen() 調(diào)用失敗并返回 FALSE,并生成一條 E_WARNING 級(jí)別的錯(cuò)誤信息。如果文件不存在則嘗試創(chuàng)建之。 這和給底層的 open(2) 系統(tǒng)調(diào)用指定 O_EXCL|O_CREAT 標(biāo)記是等價(jià)的。 此選項(xiàng)被 PHP 4.3.2 以及以后的版本所支持,僅能用于本地文件。 |
| "x+" | 創(chuàng)建并以讀寫方式打開(kāi),將文件指針指向文件頭。如果文件已存在,則 fopen() 調(diào)用失敗并返回 FALSE,并生成一條 E_WARNING 級(jí)別的錯(cuò)誤信息。如果文件不存在則嘗試創(chuàng)建之。 這和給底層的 open(2) 系統(tǒng)調(diào)用指定 O_EXCL|O_CREAT 標(biāo)記是等價(jià)的。 此選項(xiàng)被 PHP 4.3.2 以及以后的版本所支持,僅能用于本地文件。 |
您可能感興趣的文章:
- PHP使用fopen與file_get_contents讀取文件實(shí)例分享
- PHP中通過(guò)fopen()函數(shù)訪問(wèn)遠(yuǎn)程文件示例
- php使用fopen創(chuàng)建utf8編碼文件的方法
- php中file_get_content 和curl以及fopen 效率分析
- PHP fopen()和 file_get_contents()應(yīng)用與差異介紹
- php讀取本地文件常用函數(shù)(fopen與file_get_contents)
- php打開(kāi)文件fopen函數(shù)的使用說(shuō)明
- 解析php中的fopen()函數(shù)用打開(kāi)文件模式說(shuō)明
- PHP讀取網(wǎng)頁(yè)文件內(nèi)容的實(shí)現(xiàn)代碼(fopen,curl等)
- PHP 獲取遠(yuǎn)程網(wǎng)頁(yè)內(nèi)容的代碼(fopen,curl已測(cè))
- php file_put_contents()功能函數(shù)(集成了fopen、fwrite、fclose)
- php 使用fopen函數(shù)創(chuàng)建、打開(kāi)文件詳解及實(shí)例代碼
相關(guān)文章
php去掉字符串的最后一個(gè)字符附substr()的用法
今天項(xiàng)目中用到,去掉字符串中的最后一個(gè)字符,所以使用了substr,特整理了下,方便需要的朋友學(xué)習(xí)下。2011-03-03
PHP 多進(jìn)程與信號(hào)中斷實(shí)現(xiàn)多任務(wù)常駐內(nèi)存管理實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于PHP 多進(jìn)程與信號(hào)中斷實(shí)現(xiàn)多任務(wù)常駐內(nèi)存管理的相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。2019-10-10

