PHP fopen 读取带中文URL地址的一点见解
程序员文章站
2022-04-19 23:23:49
但昨天在读取一张图片的时候出问题了,后来发现是url里带中文字符。 例如下面这种情况: 复制代码 代码如下: $files = fopen('http://www.webs...
但昨天在读取一张图片的时候出问题了,后来发现是url里带中文字符。
例如下面这种情况:
$files = fopen('http://www.website.com/我的pp.jpg', 'rb');
那“$files”的返回值将会是“false”。首先我想到的是将url用urlencode编码一下,发现还是不行,原来urlencode会把“:”、“/”字符也编码了,那url就不是url了。呵,说得有些绕口,那就把“:”、“/”字符的编码替换回来就应该行的。
$url = 'http://www.website.com/我的pp.jpg';
$url = preg_replace('/\%3a/i', ':', preg_replace('/\%2f/i', '/', urlencode(urldecode($url)))); $file = fopen($url, 'rb');
试试,嘿~还真是行了。下面再温习一下fopen()函数:
fopen() 函数打开文件或者url。 如果打开失败,本函数返回false。 打开成功,本函数返回true。
一、语法:
例如下面这种情况:
复制代码 代码如下:
$files = fopen('http://www.website.com/我的pp.jpg', 'rb');
那“$files”的返回值将会是“false”。首先我想到的是将url用urlencode编码一下,发现还是不行,原来urlencode会把“:”、“/”字符也编码了,那url就不是url了。呵,说得有些绕口,那就把“:”、“/”字符的编码替换回来就应该行的。
复制代码 代码如下:
$url = 'http://www.website.com/我的pp.jpg';
$url = preg_replace('/\%3a/i', ':', preg_replace('/\%2f/i', '/', urlencode(urldecode($url)))); $file = fopen($url, 'rb');
试试,嘿~还真是行了。下面再温习一下fopen()函数:
fopen() 函数打开文件或者url。 如果打开失败,本函数返回false。 打开成功,本函数返回true。
一、语法:
复制代码 代码如下:
fopen(filename, mode, include_path, context)
参数 | 描述 |
filename | 规定要打开的文件或 url。 |
mode | 规定要求到该文件/流的访问类型。可能的值见下表。 |
include_path | 如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 true。 |
context | 规定文件句柄的环境。context 是可以修改流的行为的一套选项。 |
二、mode 参数的可能的值:
mode | 说明 |
"r" | 只读方式打开,将文件指针指向文件头。 |
"r+" | 读写方式打开,将文件指针指向文件头。 |
"w" | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
"w+" | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
"a" | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
"a+" | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
"x" | 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 false,并生成一条 e_warning 级别的错误信息。如果文件不存在则尝试创建之。 这和给底层的 open(2) 系统调用指定 o_excl|o_creat 标记是等价的。 此选项被 php 4.3.2 以及以后的版本所支持,仅能用于本地文件。 |
"x+" | 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 false,并生成一条 e_warning 级别的错误信息。如果文件不存在则尝试创建之。 这和给底层的 open(2) 系统调用指定 o_excl|o_creat 标记是等价的。 此选项被 php 4.3.2 以及以后的版本所支持,仅能用于本地文件。 |
下一篇: xml在joomla表单中的应用详解分享