توانایی خود را افزایش دهیم

فرهنگ و هنر
توانایی خود را افزایش دهیم

بسم الله الرحمن الرحیم

با سلام

• لطفا مطالب سایت را به صورت منظم پیگیری کنید
• ارائه پیشنهادات و نظرات شما باعث بهبود کیفیت ارائه مطالب خواهد شد

بعضی از مطالب آموزشی سایت توسط اینجانب نوشته نشده و صرفا جهت مطالعه دوستان از منابع دیگری جمع آوری شده است
چنانچه در مطالب موضوعی ملاحظه شد که از نظر علمی ، اعتقادی ، سیاسی ، مذهبی و ... دارای مشکل بود حتما در قسمت نظرات ذکر بفرمایید تا اصلاح گردد.
با تشکر
موفق باشید

طبقه بندی موضوعی
آخرین نظرات
  • ۲۱ خرداد ۹۶، ۲۲:۰۲ - مهدی
    سپاس
شنبه, ۲۲ شهریور ۱۳۹۳، ۰۲:۴۲ ب.ظ

درس نهم- ارسال فایل (عکس)

مقدمه
در دو درس قبل با چگونگی شناسایی کاربران ثبت نام کرده در سیستم آشنا شدیم. در این درس می‌خواهیم با معرفی تکنیک تازه ای –ارسال عکس به سیستم- به کاربر اجازه ارسال تصویر خود به سیستم را بدهیم.

 

ارسال فایل
همانند دیگر داده‌های ارسالی به سیستم ابتدا باید یک کادر برای ارسال فایل ایجاد کرد٬ اما نوع برخورد پی‌اچ‌پی با کادر ارسال فایل کمی با دیگر کادر‌ها متفاوت است. رند کلی ارسال فایل به این ترتیب است که ابتدا فایل ارسالی به یک پوشه موقتی فرستاده می‌شود و بعد از آنجا به پوشه دیگری انتقال می‌یابد.

کادر ارسال فایل

<input type="file"   name="upload” />

برای ساختن کادر فایل مانند دیگر کادرها عمل می‌کنیم٬ با این تفاوت که در داخل صفت در خواست کننه نوع فایل از کلمه "file"  استفاده می‌کنیم.

نکته: برای داشتن قابلیت ارسال فایل٬ باید یک تغییر کوچک هم در برچسب فورم بدهیم و آن اضافه کردن یک صفت تازه است. به برچسب فرم زیر دقت فرمایید:

<form  enctype="multipart/form-data"  action="upload_image.php"  method="post" >

همانطور که مشاهده می‌کنید٬ صفت enctype="multipart/form-data" به صفت‌های فرم اضافه شده است. این صفت به فرم قابلیت پذیرش فایل را اضافه می‌کند.

رفتار کادر ارسال فایل
در زمان ارسال فایل بر خلاف ارسال دیگر داده‌ها که مقدار داده را در متغییر آرایه‌ای $_POST قرار می‌دادند٬ کادر فایل مقدار را در متغییر آرایه‌ای $_FILES همراه صفت‌هایی پیش فرض قرار می‌دهد. "$_FILES[][]" یک آرایه دو بعدی است و در زمان ساخت آن ویژگی‌های متعددی از فایل مورد نظر را در خود حفظ می‌کند. بطور مثال ویژگی‌های: نوع فایل٬ نام موقتی فایل٬ اندازه فایل و نام اصلی فایل را در خورد نگهداری می‌کند که ما می‌توانیم با صفت‌هایی به همه آنها دسترسی داشته باشیم. نگهداری این مقادیر به شیوه زیر است:

$_FILES [‘نام کادر ارسال فایل’] [‘نام ویژگی’]

برای استفاده از قابلیت ارسال فایل پی‌اچ‌پی٬ باید یکسری مقدمات فراهم باشد:
۱. تنظیمات ابتدایی پی‌اچ‌پی (این تنظیمات توسط مدیر سرور انجام می‌شود٬ تنظیماتی مانند: فعال کردن ارسال فایل٬ محل موقتی نگهداری فایل‌ها٬ مشخص کردن میزان حجم فایل‌های ارسالی) در فایل php.ini. در صورت ساخت تارنما در حالت «محلی» شما به این فایل دسترسی دارید.

۲. وجود محل موقتی برای نگهداری فایل‌ها و تعیین سطح دسترسی به آن

۳. وجود محل پایانی و همیشگی برای نگهداری و تعیین سطح دسترسی به فایل‌ها

همانطور که قبلا هم گفته شده شما با استفاده از تابعphpinfo()  می‌توانید جزییات این تنظیمات را مشاهده کنید. بطور مثال تنظیمات باید چیزی مانند زیر باشند:

File_uplaods: on

upload_max_filesize: 2(پیش فرض)

post_max_size:

upload_tmp_dir:

البته در حالت نصب پی‌اچ‌پی با بستهWamp  یا  Xammpبه نظر این مقادیر به طور پیش فرض تنظیم هستند. در حالت روی خط هم می‌توانید در صورت عدم دسترسی به فایل php.ini از مدیر سرور٬ سرویس دهنده میزبانی کمک بخواهید.

حال برای آشنایی بیشتر با طرز کار این قسمت به ساخت برگه برای ارسال فایل اقدام می‌کنیم.

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

برای این کار به سراغ phpMyadmin خود رفته٬ پایگاه مورد نظر را انتخاب و بر روی جدول کاربران کلیک کنید. مطابق عکس‌های زیر خانه مورد نظر را بعد از خانه userlevel اضافه کنید:

ابتدا به قسمت Add در زیر جدول رفته و از گزینه‌های After مورد userlevel را انتخاب کنید.

حال در جدولی که باز می‌شود٬ مشخصات خانه را وارد کنید:

نام:image ٬ نوع:  VARCHAR٬ مقدار:255. بعد از نوشتن مشخصات خانه جدید٬ دکمه save را بزنید. در آینده برای دیدن عکس کاربر به این خانه مراجعه خواهیم کرد.

 

ساخت پوشه نگهدارنده عکس‌ها
در داخل پوشه فایل‌های سیستم٬ در کنار پوشه includes و دیگر فایل‌ها٬ پوشه‌ای با نام uploads  بسازید. در اصل تمام عکس‌های ارسالی کاربران در این پوشه نگه‌داری می‌شود.

برگه ارسال فایل (عکس) -  upload_image.php
فایلی با همین نام در پوشه تارنمای خود بسازید و کد‌های زیر را در داخل آن قرار دهید:

<?php

session_start();

$page_title = 'خوش آمدید';

include ('includes/header.html');

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

                // بررسی فایل ارسال شده

                if (isset($_FILES['upload'])) {

                                $errors = array(); //  یک آرایه برای نگهداری خطاها می‌سازد

                                $type = $_FILES['upload']['type'];

                                $temp = $_FILES['upload']['tmp_name'];

                                $name_old = $_FILES['upload']['name'];

                                $chunks = explode(".", $name_old);

                                $extension = end($chunks);

                                if(!empty($_POST['name']))

                                {

                                $name_new = $_POST['name'];

                                }else{

                                $name_new = rand(1,1000000). '_' . $chunks['0'] ;           

                                }

                                $name_new = $name_new. '.' .$extension;

                                if (!file_exists ("uploads/$name_new") && !is_file("uploads/$name_new"))

{              // ارزیابی نوع فایل

$allowed = array ('image/pjpeg', 'image/jpeg', 'image/JPG','image/jpg', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png');

                if (in_array($type, $allowed)) {

                                // جابجایی فایل

                                if (move_uploaded_file ($temp, "uploads/$name_new")) {

require_once ('db_connection.php'); // اتصال به پایگاه

$id = $_SESSION['user_id'];

$query ="UPDATE USERS SET image='$name_new' WHERE id ='$id'";

$row = mysqli_query($dbc, $query);

if(mysqli_affected_rows($dbc) == 1)

{

echo '<p><em>فایل ارسال شد</em></p>';     

} else {

$errors[] = ' خطا در ارسال عکس ';

if (file_exists ("uploads/$name_new") && is_file("uploads/$name_new"))

{

unlink ("uploads/$name_new");

                }

}// پایان if(mysqli_affected_rows($dbc) == 1)

} // پایان کد جابجایی فایلif (move_uploaded_file ($temp, "uploads/$name_new")) {

else

{

$errors[]=' انتقال عکس با مشکل روبرو شد';

}

}

else

{ // نوع غیر معتبرif (in_array($type, $allowed))

$errors[] = 'JPEG یا PNG لطفن نوع  ';

}

                } else    {

echo '  فایلی با این نام وجود دارد ';

                }

} // پایان isset($_FILES['upload']) IF.

// بررسی خطاها

if ($_FILES['upload']['error'] > 0) {

// چاپ پیام بر اساس خطا

switch ($_FILES['upload']['error']) {

case 1:

$errors[] = 'اندازه فایل از اندازه داخل php.ini بیشتر است ';

break;

case 2:

$errors[] = 'حجم فایل بیشتر از حد تعیین شده در فرم است';

break;

case 3:

$errors[] = ' فایل کامل ارسال نشد.';

break;

case 4:

$errors[] = ' فایلی ارسال نشد .';

break;

case 6:

$errors[] = ' پوشه موقتی پیدا نشد .';

break;

case 7:

$errors[] = ' فایل در هارد ذخیره نشد.';

break;

case 8:

$errors[] = ' ارسال فایل متوقف شد .';

break;

default:

$errors[] = '  خطا در کار سیستم .';

break;

} // پایان switch.

} // پایان error IF.

// پاک کردن فایل موقتی اگر هنوز هست

if (file_exists ($_FILES['upload']['tmp_name']) && is_file($_FILES['upload']['tmp_name']) ) {

unlink ($_FILES['upload']['tmp_name']);

}

elseif($errors)

{

echo '<div class="error">:خطاهای زیر صورت گرفته<br />';

foreach ($errors as $msg) {

echo "  .$msg - <br />";

}

echo '</div><span class="again"> دوباره امتحان کنید</span>';

}} // پایان شرط

?>

<form enctype="multipart/form-data" action="upload_image.php" method="post">

<input type="hidden" name="MAX_FILE_SIZE" value="524288" />

<fieldset>

 <legend align="right">   اندازه 512 JPEG یا PNG    انتخاب  </legend>

<label>  512KB فایل با اندازه </label>

 <input type="file" name="upload" size="20" />

<input type="text" name="name" />

</fieldset>

<div align="center"><input type="submit" name="submit" value="ارسال" class="submit"/></div>

</form>

<?php include ('includes/footer.html'); ?>

 

شرح کد‌ها
فرم

<input type="hidden" name="MAX_FILE_SIZE" value="524288" />  

برای مشخص کردن مقدار حجم فایل ارسالی از این کادر استفاده می‌کنیم.

 <input type="file" name="upload" size="20" />

این همان کادر ارسال فایل است.

<input type="text" name="name" />

این کادر را برای انتخاب نام تازه برای فایل ارسالی گذاشته‌ایم.

پی‌اچ‌پی
وقتی فرم ارسال شد٬ برنامه مقادیر داخل آرایه دو بعدی فایل را در متغییر‌های متفاوتی می‌ریزد. با این کار٬ کار کردن با این مقادیر بهتر و مشخص تر می‌شود.

$type = $_FILES['upload']['type'];

$temp = $_FILES['upload']['tmp_name'];

$name_old = $_FILES['upload']['name'];

حال برای اینکه پسوند فایل مورد نظر را داشته باشیم از٬ تابعexplode()  که تبدیل کننده رشته به آرایه است استفاده کرده و آن قسمت‌ها را بر اساس نام قدیمی است با پارامتر «.» از هم جدا کرده و در داخل خانه‌های آرایه می‌گذاریم.

$chunks = explode(".", $name_old);

این تابع رشته مورد نظر را به دو قسمت قبل از «.» و بعد از آن تبدیل کرده و در آرایه می‌گذارد. طبعا دومین خانه این آرایه همان پسوند است. که با تابع  end() آن را جدا کرده و در متغییر دیگری قرار می‌دهیم.

$extension = end($chunks);

کد‌های زیر اگر نامی برای فایل ارسالی توسط ارسال کننده انتخاب نشده باشد٬ نامی را بطور تصادفی می‌سازد:

if(!empty($_POST['name']))

{

$name_new = $_POST['name'];

}else{

$name_new = rand(1,1000000). '_' . $chunks['0'] ;           

}

$name_new = $name_new. '.' .$extension;

در آخر آن نام را همراه پسوند بدست آمده در داخل یک متغییر قرار می‌دهیم.

if (!file_exists ("uploads/$name_new") && !is_file("uploads/$name_new"))

این شرطی بررسی می‌کند که آیا قبلا فایلی با این نام در پوشه  uploadارسال شده یا نه! در صورت منفی بودن عبارت‌های شرطی٬ پاسخ آخر درست خواهد بود و به داخل کد‌های شرطی هدایت می‌شویم.

$allowed = array ('image/pjpeg', 'image/jpeg', 'image/JPG','image/jpg', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png');

برای بالاتر بردن سطح امنیت و اطمینان از اینکه کاربر عکس ارسال می‌کند و نه فایل حامل کد‌هایی برای ضربه زدن به سیستم. با درست کردن متغییری٬ پسوند‌ها و انواع فایل عکسی مورد نظر خود را در آن ذخیره می‌کنیم.

if (in_array($type, $allowed)) {

 حال شرطی بالا بررسی می‌کند که آیا نوع فایل ارسالی کاربر با یکی از انواعی که ما در متغییر $allowed  تعریف کردیم همخوانی دارد یا نه! اگر همخوانی نداشت٬ پیغام خطا چاپ می‌کند و در صورت هم خوانی وارد بخش بعدی می‌شود.

if (move_uploaded_file ($temp, "uploads/$name_new"))

در بخش بعدی٬ شرطی ما فایل مورد نظر را باز محل موقتی به محل اصلی انتقال می‌دهد و در صورت درستی انتقال٬ حال نوبت آن رسیده که مشخصات فایل در پایگاه داده‌ها هم ثبت شود.

ثبت نام فایل مورد نظر را در پایگاه با گرفتن شماره کاربری کاربر ارسال کننده از سشن و قرار دادن آن در متغییری شروع می‌کنیم.

require_once ('db_connection.php'); // اتصال به پایگاه

$id = $_SESSION['user_id'];

حال باید در پرس‌جو‌ی لازم برای جدول نوشته شده و آن را اجرا کنیم:

$query ="UPDATE USERS SET image='$name_new' WHERE id ='$id'";

$row = mysqli_query($dbc, $query);

اگر این پرس‌و‌جو درست عمل کرد پیغام "فایل ارسال شد" بده٬ وگرنه ابتدا پیغام خطا بده و بعد فایل مورد نظر را در صورت وجود آن پاک کن.

if(mysqli_affected_rows($dbc) == 1){

echo '<p><em>فایل ارسال شد</em></p>';  

}else{

$errors[] = ' خطا در ارسال عکس ';

if (file_exists ("uploads/$name_new") && is_file("uploads/$name_new")){// بررسی وجود فایل

unlink ("uploads/$name_new"); //  پاک کردن فایل در صورتی نامش که در پایگاه قرار نگرفت

}}

اگر نام فایل در پایگاه قرار نگرفت٬ بدلیل عدم استفاده از آن٬ پاکش کن.

if ($_FILES['upload']['error'] > 0)

شرطی بالا وجود هر گونه خطا را بررسی می‌کند و در صورت وجود آن‌ها٬ توسط یک سیستم  Switch و  case خطای مربوطه را شناسایی و با توجه به آن اخطار لازم را می‌دهد.

در آخر کار هم اگر همه چیز به خوبی پیش رفت٬ باید فایل ارسال شده به پوشه موقتی را پاک کنیم:

if (file_exists ($_FILES['upload']['tmp_name']) && is_file($_FILES['upload']['tmp_name']) )

{  unlink ($_FILES['upload']['tmp_name']);  }

این شرطی بررسی می‌کند که اگر فایل در پوشه موقتی بود٬ آن را پاک کن.

 

اضافه کردن پیوند ارسال فایل به سرایند  header.html
فایل سرایند را باز کرده و در قسمت فهرست‌ها پیوند زیر را اضافه کنید:

<li><a href="upload_image.php">  ارسال عکس </a></li>

این کد را در قسمت else شرطی بگذارید. بعد از گذاشتن این کد٬ آن قسمت باید شبیه زیر شود:

<?php  if(!isset($_SESSION['first_name'])) {?>

                 <li><a href="register.php">  ثبت نام </a></li>

 <?php } else { ?>

     <li><a href="view.php">  کاربران </a></li>

     <li><a href="password.php">  بروزرسانی رمز </a></li>

     <li><a href="upload_image.php">  ارسال عکس </a></li>

 <?php } ?>

با اضافه کردن پیوند برگه ارسال فایل به فهرست‌ها حال می‌توانیم عکسی به سیستم ارسال کنیم.

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

موافقین ۰ مخالفین ۰ ۹۳/۰۶/۲۲

نظرات  (۱)

۲۶ شهریور ۹۳ ، ۱۰:۴۱ حسین امیرحسینی
سلام استاد حال شو خوبه شرمنده چند وقت غیبت داشتم اینترنت نداشتم مرسی از این که این همه لطف به ما دارید از مطالب خوبتان بهترین استفاده را میکنیم خیلی سپاس گذارم

ارسال نظر

کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی