PHP fopen 读取带中文URL地址的一点见解

yipeiwu_com6年前PHP代码库
但昨天在读取一张图片的时候出问题了,后来发现是URL里带中文字符。

例如下面这种情况:
复制代码 代码如下:

$files = fopen('/zb_users/upload/202003/npwdmtxekvk.jpg', 'rb');

那“$files”的返回值将会是“False”。首先我想到的是将URL用urlencode编码一下,发现还是不行,原来urlencode会把“:”、“/”字符也编码了,那URL就不是URL了。呵,说得有些绕口,那就把“:”、“/”字符的编码替换回来就应该行的。
复制代码 代码如下:

$url = '/zb_users/upload/202003/npwdmtxekvk.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 以及以后的版本所支持,仅能用于本地文件。

相关文章

PHP读取zip文件的方法示例

PHP读取zip文件的方法示例

本文实例讲述了PHP读取zip文件的方法。分享给大家供大家参考,具体如下: <?php $zip = zip_open("111.zip"); if ($zip) {...

php简单的上传类分享

本文实例为大家分享了php上传类,供大家参考,具体内容如下 <?php class UploadFile{ var $inputName; //控件...

php和C#的yield迭代器实现方法对比分析

本文实例讲述了php和C#的yield迭代器实现方法对比。分享给大家供大家参考,具体如下: yield关键字是用来方便实现迭代器的,免去了手工写迭代器的繁琐。迭代器常被用来实现协程,所以...

过滤掉PHP数组中的重复值的实现代码

复制代码 代码如下: <?php $arrF = array(); $arrS = array(); $intTotal = 100; $intRand = 10; for($i=...

php中array_slice和array_splice函数解析

php中array_slice和array_splice函数解析

本文主要介绍了php中array_slice和array_splice函数,感兴趣的可以围观一下, array_slice和array_splice函数是用在取出数组的一段切片,arr...