引言
move_uploaded_file()
函數是原生php開發中大家很熟悉的函數,就是把表單送出的檔案移動到指定目錄
注意:隻支援post送出的資訊,如果檔案不是post表單送出的那麼該函數傳回false
問題
有些時候,我們會借助臨時目錄進行一些中轉操作
//生成一個臨時檔案
//sys_get_temp_dir() 得到臨時目錄路徑 'aaa' 檔案名稱字首
$temp_file = tempnam(sys_get_temp_dir(), 'aaa');

它的大小是0
然後我們一般會把一些請求的資源(比如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的性能會好很多。