天天看點

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的性能會好很多。