在PHP中,文件上傳是一個非常常見的需求。通過move_uploaded_file()函數,我們可以將上傳的文件安全地從臨時文件夾移動到指定的目標目錄,從而實現文件管理。本文將介紹如何結合move_uploaded_file()函數,構建一個簡單實用的文件管理系統。
move_uploaded_file()是PHP內置的一個函數,用於將上傳的文件從臨時目錄移動到目標目錄。其語法如下:
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">move_uploaded_file</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$destination</span></span><span> )
</span></span>
$filename :表示要移動的上傳文件的臨時文件路徑。
$destination :表示文件最終保存的目標路徑。
該函數只有在文件是通過HTTP POST上傳並且臨時文件存在的情況下才能成功執行。如果上傳的文件不合法,或者目標路徑不可寫,函數將返回false 。
首先,我們需要構建一個簡單的HTML表單,用戶可以通過該表單上傳文件。示例代碼如下:
<span><span><span class="hljs-tag"><<span class="hljs-name">form</span></span></span><span> </span><span><span class="hljs-attr">action</span></span><span>=</span><span><span class="hljs-string">"upload.php"</span></span><span> </span><span><span class="hljs-attr">method</span></span><span>=</span><span><span class="hljs-string">"post"</span></span><span> </span><span><span class="hljs-attr">enctype</span></span><span>=</span><span><span class="hljs-string">"multipart/form-data"</span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">label</span></span></span><span> </span><span><span class="hljs-attr">for</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span>>選擇文件上傳:</span><span><span class="hljs-tag"></<span class="hljs-name">label</span></span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">input</span></span></span><span> </span><span><span class="hljs-attr">type</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span> </span><span><span class="hljs-attr">name</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span> </span><span><span class="hljs-attr">id</span></span><span>=</span><span><span class="hljs-string">"file"</span></span><span>>
</span><span><span class="hljs-tag"><<span class="hljs-name">input</span></span></span><span> </span><span><span class="hljs-attr">type</span></span><span>=</span><span><span class="hljs-string">"submit"</span></span><span> </span><span><span class="hljs-attr">value</span></span><span>=</span><span><span class="hljs-string">"上傳文件"</span></span><span>>
</span><span><span class="hljs-tag"></<span class="hljs-name">form</span></span></span><span>>
</span></span>
在該表單中, enctype="multipart/form-data"指定了表單的數據類型,使得文件能夠被正確地上傳。 input標籤中的type="file"用於讓用戶選擇文件。
在文件上傳的處理腳本(例如upload.php )中,我們將利用move_uploaded_file()來將文件從臨時位置移動到指定的目標文件夾。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 上傳目錄</span></span><span>
</span><span><span class="hljs-variable">$uploadDir</span></span><span> = </span><span><span class="hljs-string">'uploads/'</span></span><span>;
</span><span><span class="hljs-comment">// 檢查目標文件夾是否存在,如果不存在則創建</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$uploadDir</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">mkdir</span></span><span>(</span><span><span class="hljs-variable">$uploadDir</span></span><span>, </span><span><span class="hljs-number">0755</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
}
</span><span><span class="hljs-comment">// 檢查是否有文件上傳</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>]) && </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'error'</span></span><span>] == </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-comment">// 获取上傳文件的信息</span></span><span>
</span><span><span class="hljs-variable">$fileName</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'name'</span></span><span>]; </span><span><span class="hljs-comment">// 文件名</span></span><span>
</span><span><span class="hljs-variable">$fileTmpName</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'tmp_name'</span></span><span>]; </span><span><span class="hljs-comment">// 臨時文件路徑</span></span><span>
</span><span><span class="hljs-variable">$fileSize</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'size'</span></span><span>]; </span><span><span class="hljs-comment">// 文件大小</span></span><span>
</span><span><span class="hljs-variable">$fileType</span></span><span> = </span><span><span class="hljs-variable">$_FILES</span></span><span>[</span><span><span class="hljs-string">'file'</span></span><span>][</span><span><span class="hljs-string">'type'</span></span><span>]; </span><span><span class="hljs-comment">// 文件類型</span></span><span>
</span><span><span class="hljs-comment">// 設置目標文件路徑</span></span><span>
</span><span><span class="hljs-variable">$destination</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);
</span><span><span class="hljs-comment">// 檢查文件大小(例如最大文件限制為 5MB)</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$fileSize</span></span><span> > </span><span><span class="hljs-number">5</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件過大,最大允許 5MB。"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 移動文件到目標目錄</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">move_uploaded_file</span></span><span>(</span><span><span class="hljs-variable">$fileTmpName</span></span><span>, </span><span><span class="hljs-variable">$destination</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件上傳成功!文件名:"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件上傳失敗!"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"沒有文件上傳或文件上傳出錯!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
在上面的代碼中,我們首先檢查是否有文件上傳,並驗證上傳過程中是否存在錯誤。然後,我們獲取文件的臨時路徑和文件名,並指定目標文件夾( uploads/ )作為文件的最終存放位置。如果目標文件夾不存在,腳本將自動創建該文件夾。
接著,我們使用move_uploaded_file()函數將文件從臨時路徑移動到目標文件夾中。如果移動成功,腳本會輸出成功信息。
在基本的文件上傳功能之上,我們可以進一步增強文件管理系統的功能,提供以下幾個常見操作:
可以通過讀取目標目錄下的文件列表,列出所有已上傳的文件:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff</span></span><span>(</span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$uploadDir</span></span><span>), </span><span><span class="hljs-keyword">array</span></span><span>(</span><span><span class="hljs-string">'..'</span></span><span>, </span><span><span class="hljs-string">'.'</span></span><span>));
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<ul>"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$files</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li><a href='<span class="hljs-subst">{$uploadDir}</span></span></span><span><span class="hljs-subst">{$file}</span></span><span>'></span><span><span class="hljs-subst">{$file}</span></span><span></a></li>";
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"</ul>"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
該代碼通過scandir()函數獲取目錄下的所有文件,並過濾掉.和.. ,然後將文件名顯示為超鏈接。
我們還可以提供刪除文件的功能。通過點擊刪除鏈接,用戶可以刪除指定文件:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'delete'</span></span><span>])) {
</span><span><span class="hljs-variable">$fileToDelete</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'delete'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$fileToDelete</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$fileToDelete</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件已刪除: "</span></span><span> . </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'delete'</span></span><span>];
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件不存在!"</span></span><span>;
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
在文件列表中,我們為每個文件提供了一個刪除鏈接,點擊後會觸發刪除操作。 unlink()函數用於刪除文件。
文件重命名也是文件管理系統中常見的操作。我們可以為文件提供一個重命名的功能:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'rename'</span></span><span>]) && </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'new_name'</span></span><span>])) {
</span><span><span class="hljs-variable">$oldFile</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'rename'</span></span><span>];
</span><span><span class="hljs-variable">$newFile</span></span><span> = </span><span><span class="hljs-variable">$uploadDir</span></span><span> . </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'new_name'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">rename</span></span><span>(</span><span><span class="hljs-variable">$oldFile</span></span><span>, </span><span><span class="hljs-variable">$newFile</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件重命名成功!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"重命名失敗!"</span></span><span>;
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
通過提交一個表單,用戶可以為文件指定新的文件名。 rename()函數將文件從舊名稱更改為新名稱。
通過結合move_uploaded_file()函數,PHP可以實現一個簡單實用的文件管理系統。該系統不僅支持文件的上傳,還可以提供文件列表、刪除、重命名等常見操作。在實現文件管理系統時,我們需要確保目標文件夾的權限設置正確,並且對文件的大小、類型等進行適當的驗證,以提高系統的安全性和穩定性。
通過以上步驟,你可以快速搭建一個基本的文件上傳與管理系統,並根據需求進一步擴展更多功能。