基于PHP實現(xiàn)文件讀寫與上傳功能的詳細步驟
判斷與信息獲取
判斷文件
| 函數(shù) | 說明 | 返回值 |
|---|---|---|
file_exists($path) | 判斷文件或目錄是否存在 | bool |
is_file($path) | 判斷是否是文件 | bool |
is_dir($path) | 判斷是否是目錄 | bool |
is_readable($path) | 判斷是否可讀 | bool |
is_writable($path) | 判斷是否可寫 | bool |
<?php
$file = './config.php';
$dir = './logs';
// 1. 判斷文件是否存在
if (file_exists($file)) {
echo "文件存在
";
// 2. 判斷是否是文件
if (is_file($file)) {
echo "這是一個文件
";
}
}
// 3. 判斷目錄是否存在且可寫
if (is_dir($dir) && is_writable($dir)) {
echo "目錄存在且可寫
";
}
?>獲取文件信息
| 函數(shù) | 說明 |
|---|---|
filesize($path) | 獲取文件大小(字節(jié)) |
filemtime($path) | 獲取文件最后修改時間(時間戳) |
pathinfo($path) | 獲取文件路徑信息(目錄、文件名、后綴) |
<?php
$file = './photo.jpg';
// 獲取文件大小
$size = filesize($file);
echo "文件大?。? . round($size / 1024, 2) . " KB<br>";
// 獲取最后修改時間
$mtime = filemtime($file);
echo "最后修改時間:" . date('Y-m-d H:i:s', $mtime) . "<br>";
// 獲取路徑信息
$info = pathinfo($file);
echo "文件名:" . $info['filename'] . "<br>";
echo "后綴名:" . $info['extension'] . "<br>";
echo "目錄:" . $info['dirname'] . "<br>";
?>
文件讀寫
簡單方式:file_get_contents()/file_put_contents()
// 讀取文件內(nèi)容到字符串 $content = file_get_contents(string $filename); // 將字符串寫入文件(返回寫入的字節(jié)數(shù)) file_put_contents(string $filename, mixed $data, int $flags = 0);
讀取 JSON 配置文件
<?php
// 假設(shè) config.json 內(nèi)容:{"db_host": "localhost", "db_user": "root"}
$json = file_get_contents('./config.json');
$config = json_decode($json, true); // 轉(zhuǎn)數(shù)組
echo "數(shù)據(jù)庫主機:" . $config['db_host']; // 數(shù)據(jù)庫主機:localhost
?>
寫入日志文件(追加模式)
<?php
// 日志內(nèi)容
$log = "[".date('Y-m-d H:i:s')."] 用戶登錄成功\n";
// FILE_APPEND:追加寫入(不覆蓋原內(nèi)容)
// LOCK_EX:獨占鎖(防止多人同時寫入導(dǎo)致數(shù)據(jù)混亂)
file_put_contents('./logs/app.log', $log, FILE_APPEND | LOCK_EX);
?>
底層方式:fopen()/fwrite()/fclose()
當你需要逐行讀取、寫入大文件或更精細的控制時,使用這組函數(shù)。
// 打開文件,返回資源句柄 $handle = fopen(string $filename, string $mode); // 寫入文件 fwrite(resource $handle, string $data); // 讀取一行 $line = fgets(resource $handle); // 關(guān)閉文件 fclose(resource $handle);
常用 mode 參數(shù)
| 模式 | 說明 |
|---|---|
r | 只讀,指針在開頭 |
w | 只寫,清空文件內(nèi)容,指針在開頭 |
a | 追加,指針在末尾 |
r+ | 讀寫,指針在開頭 |
逐行讀取大文件(不占內(nèi)存)
<?php
// 打開一個大文件(比如 1GB 的日志)
$handle = fopen('./large_file.log', 'r');
if ($handle) {
// 逐行讀取,直到文件結(jié)束
while (($line = fgets($handle)) !== false) {
// 處理每一行(比如過濾錯誤日志)
if (strpos($line, 'ERROR') !== false) {
echo "發(fā)現(xiàn)錯誤:" . $line . "<br>";
}
}
fclose($handle);
}
?>
目錄操作:創(chuàng)建、刪除與遍歷
| 函數(shù) | 說明 |
|---|---|
mkdir($path) | 創(chuàng)建目錄 |
rmdir($path) | 刪除空目錄 |
unlink($path) | 刪除文件 |
遞歸創(chuàng)建多級目錄
<?php
// 要創(chuàng)建的目錄路徑
$dir = './uploads/2023/10/01';
// mkdir 第三個參數(shù) true:遞歸創(chuàng)建父目錄
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
echo "目錄創(chuàng)建成功";
}
?>
遍歷目錄
scandir()(簡單遍歷,適合單層目錄)
<?php
$dir = './uploads';
// 獲取目錄下所有文件和目錄(包含 . 和 ..)
$files = scandir($dir);
// 遍歷并過濾掉 . 和 ..
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
// 判斷是文件還是目錄
$type = is_file($dir . '/' . $file) ? '文件' : '目錄';
echo $type . ":" . $file . "<br>";
}
}
?>
RecursiveDirectoryIterator(遞歸遍歷,適合多層目錄)
<?php
$dir = './uploads';
// 使用遞歸迭代器
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $file) {
// $file 是 SplFileInfo 對象
echo "路徑:" . $file->getPathname() . " - 大?。? . $file->getSize() . " 字節(jié)<br>";
}
?>
文件上傳 :圖片上傳
文件上傳是 Web 開發(fā)的經(jīng)典需求,PHP 通過 $_FILES 超全局變量和 move_uploaded_file() 函數(shù)處理。
<form action="upload.php" method="post" enctype="multipart/form-data">
選擇圖片:<input type="file" name="avatar" accept="image/*">
<input type="submit" value="上傳">
</form><?php
// 檢查是否有上傳錯誤
if ($_FILES['avatar']['error'] !== UPLOAD_ERR_OK) {
exit('上傳錯誤:' . $_FILES['avatar']['error']);
}
// 定義上傳目錄
$uploadDir = './uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
// 獲取文件后綴,生成唯一文件名
$ext = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);
$filename = uniqid() . '.' . $ext;
$destPath = $uploadDir . $filename;
// 驗證文件類型(簡單驗證:只允許圖片)
$allowedTypes = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array(strtolower($ext), $allowedTypes)) {
exit('只允許上傳圖片文件');
}
// 驗證文件大?。ㄏ拗?2MB)
if ($_FILES['avatar']['size'] > 2 * 1024 * 1024) {
exit('文件大小不能超過 2MB');
}
// 從臨時目錄移動到目標目錄
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $destPath)) {
echo "上傳成功!文件路徑:" . $destPath;
} else {
exit('文件移動失敗');
}
?>到此這篇關(guān)于基于PHP實現(xiàn)文件讀寫與上傳功能的詳細步驟的文章就介紹到這了,更多相關(guān)PHP文件讀寫與上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php使用gettimeofday函數(shù)返回當前時間并存放在關(guān)聯(lián)數(shù)組里
這篇文章主要介紹了php使用gettimeofday函數(shù)返回當前時間并存放在關(guān)聯(lián)數(shù)組里的方法,涉及php中g(shù)ettimeofday函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03
php獲得客戶端瀏覽器名稱及版本的方法(基于ECShop函數(shù))
這篇文章主要介紹了php獲得客戶端瀏覽器名稱及版本的方法,基于ECShop函數(shù)get_user_browser實現(xiàn)該功能,非常具有實用價值,需要的朋友可以參考下2015-12-12
解析thinkphp import 文件內(nèi)容變量失效的問題
本篇文章是對thinkphp import文件內(nèi)容變量失效的問題進行了詳細的分析介紹,需要的朋友參考下2013-06-06
PHP實現(xiàn)將科學(xué)計數(shù)法轉(zhuǎn)換為原始數(shù)字字符串的方法
這篇文章主要介紹了PHP實現(xiàn)將科學(xué)計數(shù)法轉(zhuǎn)換為原始數(shù)字字符串的方法,通過一個簡單的自定義函數(shù)使用正則替換實現(xiàn)該功能,是非常實用的技巧,需要的朋友可以參考下2014-12-12
PHP計算數(shù)組中值的和與乘積的方法(array_sum與array_product函數(shù))
這篇文章主要介紹了PHP計算數(shù)組中值的和與乘積的方法,結(jié)合實例形式較為詳細的分析了array_sum與array_product函數(shù)的功能與使用方法,需要的朋友可以參考下2016-04-04

