這幾天在做tp5的上傳文件模塊,項目需求是要把文件名在上傳之后修改為 用戶名+原文件名的組合形式,在網上找了一會兒發現好像沒有類似的文章。。。只好自己去研究研究了。
之前查看過看雲上面的官方手冊,文件上傳那一塊真的是講的含糊,對於我們這個為了項目自學tp5的大學生來說到處都是知識盲區啊。
Tp5文件相關操作模塊都在 thinkphp\library\think\File.php里面,我們找到第335行附近的move()函數
/**
* 移動文件
* @access public
* @param string $path 保存路徑
* @param string|bool $savename 保存的文件名 默認自動生成
* @param boolean $replace 同名文件是否覆蓋
* @return false|File
*/
public function move($path, $savename = true, $replace = true){
上面寫的 $savename 是一個String或者bool類型,所以直接傳入文件名或者文件名變量就行了
在自己的控制器代碼里寫上:
$saveName = 'Tom'; $info = $file->move('./Upload',$saveName,false);
再上傳一次就可以看到上傳的文件已經被修改為了Tom。
存進數據庫的名字也是Tom,說明文件名是完全改了的。
現在的需求是修改名字為:用戶id_文件名,但是我獲取文件的方法是使用request獲取:
$file = request()->file('files');
研究了半天發現好像沒有可以在存入服務器之前獲取到 $file的文件名,我的解決辦法是:在前端的form表單添加一個hidden的隱藏輸入框:
<input type="hidden" name="fileName" id="file_name">
通過js獲取到要上傳的文件名,再把隱藏輸入框的內容用js修改為獲取到的文件名:
var fileinfo = document.getElementById('files').files[0]; //js獲取文件名字 var name = fileinfo.name; var fileN = document.getElementById('file_name'); fileN.value = name;
這樣再提交文件的時候就可以把文件名傳到后台。
由此可得,需要什么功能直接去框架的文件里面去找,感覺比看手冊詳細多了!