PHP fopen 讀取帶中文URL地址的一點(diǎn)見解
更新時(shí)間:2012年09月25日 23:38:10 作者:
之前喜歡用fopen()函數(shù)跨域讀取圖片或其它文件,一直都沒發(fā)現(xiàn)什么問題。我所用的PHP版本都是5的了,應(yīng)該不會(huì)有CRLF Injection攻擊危險(xiǎn)吧
但昨天在讀取一張圖片的時(shí)候出問題了,后來發(fā)現(xiàn)是URL里帶中文字符。
例如下面這種情況:
$files = fopen('http://www.website.com/我的PP.jpg', 'rb');
那“$files”的返回值將會(huì)是“False”。首先我想到的是將URL用urlencode編碼一下,發(fā)現(xiàn)還是不行,原來urlencode會(huì)把“:”、“/”字符也編碼了,那URL就不是URL了。呵,說得有些繞口,那就把“:”、“/”字符的編碼替換回來就應(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ù)打開文件或者URL。 如果打開失敗,本函數(shù)返回FALSE。 打開成功,本函數(shù)返回TRUE。
一、語法:
例如下面這種情況:
復(fù)制代碼 代碼如下:
$files = fopen('http://www.website.com/我的PP.jpg', 'rb');
那“$files”的返回值將會(huì)是“False”。首先我想到的是將URL用urlencode編碼一下,發(fā)現(xiàn)還是不行,原來urlencode會(huì)把“:”、“/”字符也編碼了,那URL就不是URL了。呵,說得有些繞口,那就把“:”、“/”字符的編碼替換回來就應(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ù)打開文件或者URL。 如果打開失敗,本函數(shù)返回FALSE。 打開成功,本函數(shù)返回TRUE。
一、語法:
復(fù)制代碼 代碼如下:
fopen(filename, mode, include_path, context)
參數(shù) | 描述 |
filename | 規(guī)定要打開的文件或 URL。 |
mode | 規(guī)定要求到該文件/流的訪問類型。可能的值見下表。 |
include_path | 如果也需要在 include_path 中檢索文件的話,可以將該參數(shù)設(shè)為 1 或 TRUE。 |
context | 規(guī)定文件句柄的環(huán)境。Context 是可以修改流的行為的一套選項(xiàng)。 |
二、mode 參數(shù)的可能的值:
mode | 說明 |
"r" | 只讀方式打開,將文件指針指向文件頭。 |
"r+" | 讀寫方式打開,將文件指針指向文件頭。 |
"w" | 寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。 |
"w+" | 讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。 |
"a" | 寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。 |
"a+" | 讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。 |
"x" | 創(chuàng)建并以寫入方式打開,將文件指針指向文件頭。如果文件已存在,則 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)建并以讀寫方式打開,將文件指針指向文件頭。如果文件已存在,則 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中通過fopen()函數(shù)訪問遠(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打開文件fopen函數(shù)的使用說明
- 解析php中的fopen()函數(shù)用打開文件模式說明
- PHP讀取網(wǎng)頁文件內(nèi)容的實(shí)現(xiàn)代碼(fopen,curl等)
- PHP 獲取遠(yuǎn)程網(wǎng)頁內(nèi)容的代碼(fopen,curl已測(cè))
- php file_put_contents()功能函數(shù)(集成了fopen、fwrite、fclose)
- php 使用fopen函數(shù)創(chuàng)建、打開文件詳解及實(shí)例代碼
相關(guān)文章
php中計(jì)算中文字符串長度、截取中文字符串的函數(shù)代碼
在做PHP開發(fā)的時(shí)候,由于我國的語言環(huán)境問題,所以我們常常需要對(duì)中文進(jìn)行處理。2011-08-08PHP基于面向?qū)ο髮?shí)現(xiàn)的留言本功能實(shí)例
這篇文章主要介紹了PHP基于面向?qū)ο髮?shí)現(xiàn)的留言本功能,結(jié)合實(shí)例形式分析了php基于面向?qū)ο蟮牧粞员鞠嚓P(guān)寫入、顯示查看、日志記錄等相關(guān)方法封裝與使用技巧,需要的朋友可以參考下2018-04-04利用PHP判斷是手機(jī)移動(dòng)端還是PC端訪問的函數(shù)示例
在平常工作開發(fā)中,我們通常需要開發(fā)出PC端和移動(dòng)端兩個(gè)不同的系統(tǒng),從而根據(jù)訪問端的不同進(jìn)入到不同的操作界面中。下面這篇文章主要給大家介紹了關(guān)于利用PHP判斷是手機(jī)移動(dòng)端還是PC端訪問的函數(shù)的相關(guān)資料,需要的朋友可以參考下。2017-12-12PHP同時(shí)連接多個(gè)mysql數(shù)據(jù)庫示例代碼
這篇文章主要介紹了PHP同時(shí)連接多個(gè)mysql數(shù)據(jù)庫的具體實(shí)現(xiàn),需要的朋友可以參考下2014-03-03php提交post數(shù)組參數(shù)實(shí)例分析
這篇文章主要介紹了php提交post數(shù)組參數(shù)的用法,結(jié)合實(shí)例分析了php使用post進(jìn)行參數(shù)提交的相關(guān)技巧,需要的朋友可以參考下2015-12-12PHP中return 和 exit 、break和contiue 區(qū)別與用法
return、break和contiue是語言結(jié)構(gòu),就如同if語句之類的,但是exit卻是個(gè)函數(shù)2012-04-04