کار با فایل ها: Create/Write و آپلود فایل ها

07 مرداد 1398
درسنامه درس 18 از سری آموزش PHP 7
کار با فایل ها: Create/Write و آپلود فایل ها

کار با فایل ها: Create/Write

در قسمت قبلی با باز کردن و خواندن فایل ها آشنا شدیم. در این قسمت می خواهیم فایلی را باز کرده یا بسازیم و درون آن چیزی بنویسیم (عملیات write). ما با استفاده از تابع ()fopen در جلسه ی قبل فایل ها را باز می کردیم اما اگر از جدول جلسه ی قبل یادتان باشد می توانیم از ()fopen برای ساخت یک فایل جدید نیز استفاده کنیم:

Mode توضیحات
r فایل را فقط برای خواندن (read) باز می کند. pointer از اول فایل شروع می شود.
w فایل را فقط برای نوشتن (write) باز می کند. pointer از اول فایل شروع می شود. همچنین محتوای فایل را پاک کرده و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
a فایل را فقط برای نوشتن (write) باز می کند. pointer از آخر فایل شروع می شود. محتوای قبلی فایل را پاک نمی‌کند و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
x یک فایل جدید برای نوشتن (Write) می سازد. اگر فایل از قبل وجود داشته باشد FALSE و یک پیام خطا را به ما برمیگرداند.
+r فایل را برای خواندن (read) و نوشتن (write) باز می کند. pointer از اول فایل شروع می شود.
+w فایل را برای خواندن (read) و نوشتن (write) باز می کند. pointer از اول فایل شروع می شود. همچنین محتوای فایل را پاک کرده و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
+a فایل را برای خواندن (read) و نوشتن (write) باز می کند. pointer از آخر فایل شروع می شود. محتوای قبلی فایل را پاک نمی‌کند و اگر فایل را پیدا نکند یک فایل دیگر می سازد.
+x یک فایل جدید برای خواندن (read) و نوشتن (Write) می سازد. اگر فایل از قبل وجود داشته باشد FALSE و یک پیام خطا را به ما برمیگرداند.

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

به طور مثال کد زیر فایلی به نام testfile.txt می سازد. این فایل در همان مسیری ساخته می شود که کد های زیر در آن قرار داشته باشد:

$myfile = fopen("testfile.txt", "w")

بنابراین اگر این کد در مسیر www/myprojects/php7/file_handling قرار داشته باشد، فایل جدید نیز در همین مسیر و در پوشه ی file_handling ایجاد می شود.

نکته: اگر در هنگام ساخت یا ویرایش کد ها با خطا مواجه شدید باید permission ها را چک کنید. به طور مثال با چه mode ای فایل را باز کرده اید؟ آیا به PHP اجازه ی دسترسی به فایل ها را داده اید؟

حالا که فایل را ایجاد کرده ایم باید از تابع ()fwrite برای نوشتن در آن استفاده کنیم. اولین پارامتر ()fwrite نام فایلی است که می خواهیم در آن چیزی بنویسیم و پارامتر دوم رشته ای است که می خواهید به فایل اضافه شود.

مثال زیر چند نام را در فایل newfile.txt می نویسد:

<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "John Doe\n";
fwrite($myfile, $txt);
$txt = "Jane Doe\n";
fwrite($myfile, $txt);
fclose($myfile);
?>

همانطور که می بینید ابتدا فایل را باز کرده ایم (با mode حرف W)، سپس نام ها را اضافه کرده و در آخر فایل را بسته ایم. اگر الان فایل newfile.txt را باز کنیم محتویات آن به شکل زیر خواهد بود:

John Doe
Jane Doe

حالا فایلی داریم که محتوای مشخصی دارد. اگر این فایل را دوباره برای نوشتن (write) باز کنیم تمام اطلاعات آن حذف می شوند و یک فایل خالی خواهیم داشت! مثال زیر اطلاعات قبلی فایل newfile.txt را حذف کرده و اطلاعات جدیدی در آن می نویسد:

<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "Mickey Mouse\n";
fwrite($myfile, $txt);
$txt = "Minnie Mouse\n";
fwrite($myfile, $txt);
fclose($myfile);
?>

حالا اگر محتویات فایل newfile.txt را چک کنیم اطلاعات جدید را خواهیم دید:

Mickey Mouse
Minnie Mouse

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

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

1. فایل php.ini را تنظیم کنید

اول از همه باید مطمئن شویم که PHP اجازه ی آپلود دارد. بنابراین به فایل php.ini رفته و به دنبال دستور file_uploads بگردید:

file_uploads = On

این دستور باید به شکل بالا روی On باشد.

2. یک فرم HTML بسازید

حالا باید یک فرم HTML بسازیم که به کاربران اجازه دهد به طور مثال فایل تصویری خود را آپلود کنند:

<!DOCTYPE html>
<html>
<body>

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

</body>
</html>

برای ساخت این فرم باید به نکات زیر توجه کنید:

  • مطمئن شوید که فرم از متد "method="post استفاده می کند.
  • برای آپلود فایل به attribute ای به نام "enctype="multipart/form-data نیاز خواهید داشت. این attribute مشخص می کند که هنگام آپلود فایل از چه content-type ای استفاده شود.
  • استفاده از "type="file به کاربر دکمه ی انتخاب فایل (browse) را نشان می دهد بنابراین از آن فراموش نکنید.

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

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
?>

در این اسکریپت:

  • با استفاده از متغیر target_dir$ دیرکتوری یا مسیری را مشخص کرده ایم که فایل باید در آنجا آپلود شود.
  • متغیر target_file$ مسیر فایل آپلود شده را مشخص می کند.
  • متغیر uploadOk=1 فعلا استفاده نشده است (بعدا از آن استفاده خواهیم کرد).
  • متغیر imageFileType$ پسوند فایل را به صورت حروف کوچک در خود ذخیره می کند.
  • در مرحله ی آخر چک کرده ایم تا ببینیم آیا فایل تصویری ارسال شده واقعا یک فایل تصویری است یا خیر (اگر فایل، فایل تصویری نباشد تابع getimagesize نمی تواند کاری کند و false می شود.

نکته: شما باید یک پوشه ی جدید به نام uploads (به خاطر اینکه در اسکریپت گفته ایم "/target_dir = "uploads$) در کنار فایل upload.php بسازیم چرا که فایل های آپلود شده به آنجا منتقل خواهند شد.

3. آیا فایل از قبل وجود دارد؟

باید اول از همه چک کنیم و ببینیم آیا فایل ارسالی از قبل در پوشه ی uploads وجود داشته است یا خیر؟ اگر از قبل وجود داشته باشد یک پیام خطا به کاربر نمایش داده و uploadOk$ را روی 0 قرار می دهیم:

// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}

4. حجم و نوع فایل ارسالی را محدود کنید

فیلد آپلود فایل ما در HTML به نام fileToUpload تعیین شده است. بنابراین می توانیم چک کنیم که اگر فایل ارسالی بیشتر از 500KB (عدد فرضی است) باشد پیام خطا نمایش داده شده و uploadOk$ نیز برابر 0 شود:

// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}

همچنین برای محدود کردن نوع فایل می خواهیم تنها پسوندهای JPG و JPEG و PNG و GIF را مجاز کنیم. فایل هایی با پسوندهای دیگر با پیام خطا مواجه شده و uploadOk$ را 0 می کنند:

// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}

در آخر اسکریپت تکمیل شده ی ما به شکل زیر خواهد بود:

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

امیدوارم از این قسمت از آموزش PHP 7 یعنی آموزش کار با فایل ها شامل اقدامات Create/Write و آپلود فایل با PHP لذت برده باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش PHP 7 توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی
14 مرداد 1398
سلام جناب زوارمی بسیار متشکرم از اموزش هاتون ،آیا قصد آموزش پایتون سمت وب رو ندارین مخصوصا جنگو

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
16 مرداد 1398
سلام دوست عزیز خوشحالم که از آموزش ها راضی بودین. متاسفانه فعلا (در آینده ی نزدیک) قصد رفتن به سمت پایتون رو ندارم اما در آینده ی دور ممکنه این مباحث رو هم کار کنیم.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.