天天看点

php移动文件的函数 move_uploaded_file() 、tempnam()、 copy() 、unlink() 、 rename()的一系列操作解析

引言

move_uploaded_file()

函数是原生php开发中大家很熟悉的函数,就是把表单提交的文件移动到指定目录

注意:只支持post提交的信息,如果文件不是post表单提交的那么该函数返回false

问题

有些时候,我们会借助临时目录进行一些中转操作

//生成一个临时文件
//sys_get_temp_dir() 得到临时目录路径    'aaa' 文件名称前缀
 $temp_file = tempnam(sys_get_temp_dir(), 'aaa');
           
php移动文件的函数 move_uploaded_file() 、tempnam()、 copy() 、unlink() 、 rename()的一系列操作解析

它的大小是0

php移动文件的函数 move_uploaded_file() 、tempnam()、 copy() 、unlink() 、 rename()的一系列操作解析

然后我们一般会把一些请求的资源(比如curl请求一个在线的图片地址等)给放写进去(为什么不用file_put_contents呢?因为这个性能比较好)

//写入临时本地
$fp = fopen($temp_file, 'w');
fwrite($fp, $res);
fclose($fp);
           

然后进行一系列的文件检查合法性(比如文件大小啊、mime类型啊),如果验证合法就进行文件移动,如果不合法就直接使用

unlink($temp_file)

删除,但是我们前面说过

move_uploaded_file()

是不支持非表单提交的文件移动的。

所以我们可以直接用

copy()

函数进行移动文件,这个函数和

move_uploaded_file()

一样如果目标文件已经存在会直接替换

copy($temp_file, $path);
           

但是这样就会导致临时文件还在原来的目录,所以这个时候可以等待文件复制完毕后使用

unlink($temp_file)

函数把临时目录的文件给删除,那有没有函数可以稍微简化这个步骤呢?

答案是肯定的。可以使用

rename()

函数来代替copy+unlink的步骤。

$res = rename($temp_file, 'D:/233.jpg');
           

而且这样比copy+unlink的性能会好很多。