در قسمت قبلی با باز کردن و خواندن فایل ها آشنا شدیم. در این قسمت می خواهیم فایلی را باز کرده یا بسازیم و درون آن چیزی بنویسیم (عملیات 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
آپلود (Upload) فایل ها به سرور در زبان PHP بسیار ساده است اما این سادگی یعنی خطرات زیادی هم وجود دارد. برای آپلود فایل با PHP روی وب سایت خود مراحل زیر را طی کنید تا خطرات را به حداقل برسانید.
اول از همه باید مطمئن شویم که PHP اجازه ی آپلود دارد. بنابراین به فایل php.ini رفته و به دنبال دستور file_uploads
بگردید:
file_uploads = On
این دستور باید به شکل بالا روی On باشد.
حالا باید یک فرم 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
استفاده می کند."enctype="multipart/form-data
نیاز خواهید داشت. این attribute مشخص می کند که هنگام آپلود فایل از چه content-type ای استفاده شود.بدون دو مورد اول آپلود فایل امکان پذیر نیست اما مورد سوم را می توان به روش های مختلف پیاده سازی کرد. فرم بالا فایل را به 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; } } ?>
در این اسکریپت:
نکته: شما باید یک پوشه ی جدید به نام uploads (به خاطر اینکه در اسکریپت گفته ایم "/target_dir = "uploads$
) در کنار فایل upload.php بسازیم چرا که فایل های آپلود شده به آنجا منتقل خواهند شد.
باید اول از همه چک کنیم و ببینیم آیا فایل ارسالی از قبل در پوشه ی uploads وجود داشته است یا خیر؟ اگر از قبل وجود داشته باشد یک پیام خطا به کاربر نمایش داده و uploadOk$ را روی 0 قرار می دهیم:
// Check if file already exists if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = 0; }
فیلد آپلود فایل ما در 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 لذت برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.