فایل در php

فایل در PHP

مدیریت فایلها و نحوه آپلود آنها یکی از بخشهای مهم هر وبسایتی می باشد. در اکثر وبسایتها برای کار با وبسایت نیاز هست که با فایلها کار کنید. این مقاله نحوه مدیریت و کار با فایل در PHP را به شما آموزش خواهیم داد.

PHP توابعی برای ایجاد، ویرایش و حذف فایلها گنجاده است که از آنها برای مدیریت فایلها استفاده خواهیم کرد.

نکته: در کار با فایلها باید با دقت عمل شود زیرا ممکن است اشتباهی فایل دیگری ویرایش شود و یا حذف شود.

خواندن فایل در PHP

خواندن فایل با تابع readfile

تابع readfile() فایل مورد نظر را خوانده و در بافر خروجی قرار می دهد.

در کنار فایل php خود فایلی با نام “myfile.txt” ایجاد کنید و متن زیر را در آن ذخیره کنید.

Ferrari: Is from Italy
Benz: Is from Germany
Toyota: Is from Japan

سپس فایل php خود را باز می کنمد و برای خواندن و نمایش محتوای فایل از دستور زیر استفاده نماییم.

echo readfile("myfile.txt");
---------------------
Ferrari: Is from Italy Benz: Is from Germany Toyota: Is from Japan68

عدد آخر در متن نشان دهنده تعداد کاراکترهای خوانده شده است.

تابع readfile() فقط برای زمانی خوب است که می خواهید فایلی را باز کرده و محتوای آن را بخوانید. برای خواندن فایل روشهای دیگر و بهتری هم وجود دارد که در ادامه به آن خواهیم پرداخت.

خواندن فایل با تابع fopen در PHP

تابع fopen() مانندتابع readfile() برای خواندن فایل استفاده می شود اما دارای گزینه های بیشتر می باشد.

$myfile = fopen("myfile.txt", "r") or die("Unable to open file!");
if ($myfile) {
    echo fread($myfile, filesize("myfile.txt"));
    fclose($myfile);
}

پارامتر اول تابع fopen() حاوی نام فایلی است که باید باز شود و پارامتر دوم مشخص می کند که فایل در چه حالتی باید باز شود. اگر تابع نتواند فایل را باز کند پیامی برای کاربر نمایش داده می دهد.

تابع fread() محتوای فایل باز شده را می خواند. اولین پارامتر این تابع نام فایلی است که می خواهیم خوانده شود و پارامتر دوم تعداد بایتهایی است که باید خوانده شود. در این مثال تمام فایل تا انتها خوانده می شود.

تابع fclose() هم برای بستن فایل باز شده به کار می رود. در این مثال تابع فقط فایل باز شده را می بندد اما اگر می خواهید تمام فایلهای باز را ببندید می توانید از تابع fclose() بدون متغیر فایل استفاده نمایید.

fclose();

حال به حالتهای باز کردن فایل می پردازیم.

  • r: فایل را فقط برای خواندن باز می کند (read only). اشاره گر فایل از ابتدای فایل شروع می شود.
  • w : فایل را فقط برای نوشتن باز می کند. اگر فایل از قبل وجود داشته باشد، محتویات فایل را پاک می کند یا در صورت عدم وجود فایل، فایل جدیدی ایجاد می کند. اشاره گر فایل از ابتدای فایل شروع می شود.
  • a: فایل را فقط برای نوشتن باز می کند. اگر فایل از قبل وجود داشته باشد، داده های موجود در فایل حفظ می شود و در صورت عدم وجود فایل، فایل جدیدی ایجاد می کند. نشانگر فایل از انتهای فایل شروع می شود.
  • x: فایل جدیدی را فقط جهت نوشتن ایجاد می کند. اگر فایل از قبل موجود باشد false به همراه خطا بازگشت می دهد.
  • +r: فایل را برای خواندن و نوشتن باز می کند. اشاره گر فایل از ابتدای فایل شروع می شود.
  • +w: فایل را برای خواندن و نوشتن باز می کند. اگر فایل از قبل وجود داشته باشد، محتویات فایل را پاک می کند یا در صورت عدم وجود فایل، فایل جدیدی ایجاد می کند. اشاره گر فایل از ابتدای فایل شروع می شود.
  • +a: فایل را برای خواندن و نوشتن باز می کند. اگر فایل از قبل وجود داشته باشد، داده های موجود در فایل حفظ می شود و در صورت عدم وجود فایل، فایل جدیدی ایجاد می کند. نشانگر فایل از انتهای فایل شروع می شود.
  • +x: فایل را برای خواندن و نوشتن باز می کند. اگر فایل از قبل موجود باشد false به همراه خطا بازگشت می دهد.

خواندن یک خط از فایل

تابع fgets() برای خواندن یک خط از یک فایل استفاده می شود.

$myfile = fopen("myfile.txt", "r") or die("Unable to open file!");
if ($myfile) {
    echo fgets($myfile);
    fclose($myfile);
}
---------------------
Ferrari: Is from Italy

بعد از فراخوانی تابع اشاره گر فایل به خط بعدی می رود. بنابراین اگر دوباره تابع را فراخوانی کنیم، خط دوم را باز می گرداند.

بررسی آخر فایل

تابع feof() بررسی می‌کند که آیا به “انتهای فایل” (EOF) رسیده است یا خیر. این تابع برای خواندن فایل در حلقه های تکرار مناسب است زیرا تا زمانی که به انتهای فایل نرسیده باشد، حلقه تکرار می شود.

$myfile = fopen("myfile.txt", "r") or die("Unable to open file!");
if ($myfile) {
    while (!feof($myfile)) {
        echo fgets($myfile) . "<br>";
    }
    fclose($myfile);
}
-------------------
Ferrari: Is from Italy
Benz: Is from Germany
Toyota: Is from Japan

خواندن فایل بصورت کاراکتر به کاراکتر

تابع fgetc() برای خواندن یک کاراکتر از یک فایل استفاده می شود.

$myfile = fopen("myfile.txt", "r") or die("Unable to open file!");
if ($myfile) {
    while (!feof($myfile)) {
        echo fgetc($myfile);
    }
    fclose($myfile);
}
------------------
Ferrari: Is from Italy Benz: Is from Germany Toyota: Is from Japan

خواندن فایل با تابع file

این تابع تمام محتوای فایل را خوانده و در متغیر قرار می دهد.

$myfile = file("myfile.txt") or die("Unable to open file!");

foreach ($myfile as $line_num => $line) {
    echo "Line #{$line_num} : " . htmlspecialchars($line) . "<br />\n";
}
----------------------
Line #0 : Ferrari: Is from Italy
Line #1 : Benz: Is from Germany
Line #2 : Toyota: Is from Japan 

همچنین می توانیم با استفاده از پرچم ها امکانات بیشتری به تابع اضافه کنیم. برای مثال نخواندن خطهای خالی فایل.

$myfile = file("myfile.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  • FILE_USE_INCLUDE_PATH: فایل را در include_path جستجو می کند.
  • FILE_IGNORE_NEW_LINES: خط جدید را در انتهای هر آیتم آرایه حذف می کند.
  • FILE_SKIP_EMPTY_LINES: از خطوط خالی صرف نظر می کند.

خواندن فایل با تابع file_get_contents

این تابع تمام محتوای فایل را داخل متغیر رشته ای می خواند.

$myfile = file_get_contents("myfile.txt") or die("Unable to open file!");

if($myfile){
    echo $myfile;
}

با این تابع می توان محتوای HTML صفحه وبسایتی را نیز خواند.

$myfile = file_get_contents("https://honarsystems.ir/") or die("Unable to open file!");

if($myfile){
    echo $myfile;
}

نوشتن فایل در PHP

همانطور که در قسمت حالتهای باز کردن فایل مشاهده کردید، حالتهایی برای نوشتن فایل وجود داشت. حال از آنها برای ایجاد و یا نوشتن فایل استفاده خواهیم کرد. برای اینکار مثل مثالهای قبل اول باید فایل را با تابع fopen() باز کنیم.

تابع fwrite() برای نوشتن روی یک فایل استفاده می شود.

$myfile = fopen("myfile.txt", "w") or die("Unable to open file!");
$txt = "BMW: Is from Germany\n";
fwrite($myfile, $txt);
$txt = "Toyota: Is from Japan\n";
fwrite($myfile, $txt);
fclose($myfile);

پارامتر اول تابع fwrite() شامل نام فایلی است که می خواهیم روی آن بنویسیم و پارامتر دوم رشته ای است که می خواهیم داخل فایل بنویسیم. برای نوشتن هر خط در فایل باید تابع fwrite() را فراخوانی کنیم.

اگر فایل را باز کنید دو خط زیر را مشاهده خواهید کرد.

BMW: Is from Germany
Toyota: Is from Japan

چون از “w” استفاده کردیم بنابراین تمام محتوای فایل پاک شد و داده های جدید جایگزین آنها شد.

Append کردن محتوا به فایل

حال اگر ما بخواهیم به ادامه محتوای قبلی محتوای جدید اضافه کنیم و محتوای قبلی پاک نشود، از روش زیر استفاده می کنیم.

محتوای زیر از قبل در فایل وجود دارد.

Ferrari: Is from Italy
Benz: Is from Germany
Toyota: Is from Japan

و کد زیر را اجرا می کنیم.

$myfile = fopen("myfile.txt", "a") or die("Unable to open file!");
$txt = "BMW: Is from Germany\n";
fwrite($myfile, $txt);
fclose($myfile);

اگر فایل را باز کنید خواهید دید که محتوای جدید به ادامه محتوای قبلی اضافه (Append) شده است.

Ferrari: Is from Italy
Benz: Is from Germany
Toyota: Is from Japan
BMW: Is from Germany

تنها فرقی که بین این روش و روش قبلی وجود دارد در تابع fopen() و پارامتر دوم است که در اولی “w” بود و در این “a” می باشد.

حذف فایل در PHP

برای حذف فایل در PHP از تابع unlink() استفاده می شود.

unlink("myfile.txt");

آپلود فایل در PHP

در PHP شما می توانید به راحتی فایلی را به سرور آپلود کنید. اما به یاد داشته باشید که موارد امنیتی را رعایت کنید زیرا آپلود فایل به راحتی می توان امنیت سرور را تهدید کند.

به هر حال برای شروع باید مطمئن شوید که امکان آپلود فایل بر روی سرور وجود دارد یا نه. برای این کار باید فایل “php.ini” را باز کرده و گزینه file_uploads را به On تغییر دهید.

file_uploads = On 

اطلاعات موجود در صفحه php.ini دارای متغیرهای زیادی می باشد که از این میان upload_tmp_dir پوشه موقتی را که برای آپلود فایل استفاده می‌شود، مشخص می کند و حداکثر اندازه مجاز فایل‌هایی که می‌توان آپلود کرد نیز در upload_max_filesize تعریف می شود.

بعد از این کار ابتدا وارد پوشه کد می شویم و فایل index.html را ایجاد می کنیم. سپس فایل را باز می کنیم و کدهای زیر را در آن قرار می دهیم.

<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
  Select file to upload:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload File" name="submit">
</form>

</body>
</html>

نکاتی که باید مد نظر داشته باشید:

  • حتما قسمت method را post قرار دهید.
  • گزینه enctype=”multipart/form-data” باید وجو داشته باشد تا مشخص کند که از کدام نوع محتوا هنگام ارسال فرم استفاده شود.

کد بالا فایل آپلود شده را به فایل upload.php ارسال خواهد کرد. حال نوبت کدنویسی فایل upload می باشد.

در کنار فایل upload.php پوشه ای با نام uploads ایجاد نمایید. این همان پوشه ای است که فایل ها داخل آن آپلود خواهند شد.

$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

// Check if image file is a actual image or fake image
if (isset($_POST["submit"])) {
    // Check if file already exists
    if (file_exists($target_file)) {
        echo "Sorry, file already exists.";
    } else {
        // Check file size
        if ($_FILES["fileToUpload"]["size"] > ۵۰۰۰۰۰) {
            echo "Sorry, your file is too large.";
        } else {
            // Allow certain file formats
            if (
                $imageFileType != "jpg" 
                && $imageFileType != "png" 
                && $imageFileType != "jpeg"
                && $imageFileType != "gif"
                && $imageFileType != "pdf"
            ) {
                echo "Sorry, only JPG, JPEG, PNG, GIF & PDF files are allowed.";
            }
            else{
                if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
                    echo "The file " . htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded.";
                } else {
                    echo "Sorry, there was an error uploading your file.";
                }
            }
        }
    }
}

سه خط اول نام، مسیر آپلود و نوع فایل را استخراج می کنند.

در این مثال به ترتیب چک می کنیم که آیا آپلودی از طریق فرم صورت گرفته است یا نه. بررسی می کنیم که آیا فایلی با این نام از قبل وجود دارد یا نه. سپس اندازه فایل را بررسی می کنیم که باید از ۵۰۰KB کمتر باشد. سپس نوع فایل آپلود شده را بررسی می کنیم که باید یکی از نوع فایلهای تعریف شده در کد باشد.

فایلهای آپلود شده بر روی سرور ابتدا به داخل پوشه tmp در سرور آپلود می شوند با استفاده از تابع move_uploaded_file() آن را از پوشه tmp به پوشه مورد نظر انتقال می دهیم.

اگر در هنگام آپلود فایل هر یک از موارد بالا درست نباشد، خطای مربوط به هر کدام برای کاربر نمایش داده خواهد شد.

در مثال بالا متغیرهای global استفاده شده است که به شرح زیر می باشد:

  • $_FILES['file']['tmp_name']: نام فایل آپلود شده در دایرکتوری موقت روی وب سرور.
  • $_FILES['file']['name']: نام واقعی فایل آپلود شده
  • $_FILES['file']['size']: اندازه فایل آپلود شده بر حسب بایت
  • $_FILES['file']['type']: نوع MIME فایل آپلود شده
  • $_FILES['file']['error']: کد خطای مرتبط با آپلود این فایل.

آپلود چندین فایل

برای آپلود چندین فایل بصورت همزمان در PHP باید در مثال قبل کمی تغییر ایجاد کنیم.

فایل index.html را باز کرده و قسمت form را به صورت زیر تغییر دهید.

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select file to upload:
    <input type="file" name="fileToUpload[]" id="fileToUpload" multiple="multiple">
    <input type="submit" value="Upload File" name="submit">
</form>

در input در قسمت name به آخر اسم [] اضافه می کنیم. همچنین صفت multiple را نیز اضافه می کنیم تا کاربر بتواند چندین فایل را انتخاب کند.

حال فایل upload.php را باز کرده، کدهای قبلی را پاک کنید و کد زیر را در آن قرار دهید.

$files = array_filter($_FILES['fileToUpload']['name']);

$total_count = count($_FILES['fileToUpload']['name']);

$target_dir = "uploads/";

// Check if image file is a actual image or fake image
if (isset($_POST["submit"])) {
    for ($counter = 0; $counter < $total_count; $counter++) {
        $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"][$counter]);
        $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));


        // Check if file already exists
        if (file_exists($target_file)) {
            echo "Sorry, file already exists.";
        } else {
            // Check file size
            if ($_FILES["fileToUpload"]["size"][$counter] > ۵۰۰۰۰۰) {
                echo "Sorry, your file is too large.";
            } else {
                // Allow certain file formats
                if (
                    $imageFileType != "jpg"
                    && $imageFileType != "png"
                    && $imageFileType != "jpeg"
                    && $imageFileType != "gif"
                    && $imageFileType != "pdf"
                ) {
                    echo "Sorry, only JPG, JPEG, PNG, GIF & PDF files are allowed.";
                } else {
                    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"][$counter], $target_file)) {
                        echo "The file " . htmlspecialchars(basename($_FILES["fileToUpload"]["name"][$counter])) . " has been uploaded.";
                    } else {
                        echo "Sorry, there was an error uploading your file.";
                    }
                }
            }
        }
    }
}

بیشتر قسمتها مانند مثال قبل است با این تفاوت که در خط اول با استفاده از تابع array_filter فایلهایی که نام آنها خالی است را حذف می کنیم. سپس فرآیند آپلود فایل را داخل حلقه for قرار می دهیم تا به تعداد فایلها این فرآیند تکرار شود.

تابع is_readable

برای بررسی فایل به کار می رود که آیا می توان فایل مورد نظر را خواند یا نه.

echo is_readable("myfile.txt");

در صورت قابل خواندن عدد ۱ را بازمیگرداند. گاهی فایل وجود ندارد و گاهی نیز فایل وجود دارد اما اجازه خواند فایل توسط سرور به شما داده نمی شود. این تابع بررسی می کند که آیا امکان خواندن فایل وجود دارد یا نه.

مطالب مرتبط