آگهی
article

آموزش نحوه آپلود فایل با PHP و ای جکس (Ajax)

ajax-php-file-upload

انجام آپلود در صفحات وب از طریق فرم های HTML یکی از شیوه های متداولی است که برای ارسال و ذخیره سازی فایل ها در فرمت های مختلف از سمت سیستم کاربر به حافظه سرور کاربرد دارد، در این شیوه در حالت معمول اگر بخواهیم فایلی را به سرور ارسال کنیم با اتمام فرایند آپلود آدرس صفحه مرورگر به طور خودکار تغییر کرده و به آدرس مقصدی که در قسمت action تگ form در نظر گرفته ایم منتقل می شود، این ساز و کار در عمل فایل را آپلود می کند اما ممکن است با توجه به رابط کاربری مد نظر ما شیوه بهینه نباشد و اینکه آدرس صفحه پس از آپلود رفرش یا منتقل شود کاربران برنامه را به زحمت بیندازد، خوشبختانه برای تغییر این حالت روش هایی وجود دارد که به کمک آنها می توانیم بدون اینکه صفحه رفرش یا منتقل شود فایل را به سرور ارسال کنیم و از آنجایی که بیشتر این روش ها مبتنی بر تکنیک ای جکس (Ajax) یا شبیه سازی شده از فرایند ای جکس است در این آموزش قصد داریم به نحوه آپلود فایل با برنامه نویسی PHP و Ajax بپردازیم.

ساز و کار آپلود فایل در وب


قبل از پرداختن به ادامه این آموزش لازم است برای داشتن درک صحیحی از فرایند آپلود فایل در وب به طور مختصر به ساز و کار آن اشاره ای داشته باشیم.
دسترسی به فایل های کاربران در وب از لحاظ امنیتی یک استثناء و مجوزی پر ریسک است اما کمتر سرویس تحت وبی است که بی نیاز از این امکان باشد، بر همین مبنا جهت حفظ حریم خصوصی کاربران این قابلیت صرفا از طریق کدهای HTML و عناصر زیرمجموعه تگ form وجود دارد که حق انتخاب و آپلود فایل در دست کاربر باشد تا اگر خود او تمایل داشت فایل های مورد نظرش را انتخاب و تحت پروتکل های انتقال داده در وب به سرور ارسال نماید، در سرور این فایل ها توسط برنامه نویسی سمت سرور مانند زبان PHP یا موارد مشابه مدیریت می شوند و اگر همه چیز درست باشد فایل بر روی حافظه سخت افزاری یا به عبارتی هارددیسک سرور ذخیره شده و از این لحظه قابل استفاده است.

چگونه یک فایل را با ای جکس آپلود کنیم؟


پس از بکارگیری تکنیک های مبتنی بر ای جکس از سال 2000 میلادی توسط برخی توسعه دهندگان وب و استفاده همگانی از این فناوری (با معرفی نسخه بتای گوگل مپ) در سال 2005 تا چندین سال بعد اگرچه از بسیاری جنبه ها پیشرفت کرده بود و می توانستیم به کمک آن مقادیر موجود در فرم های HTML را بدون رفرش صفحه به سرور ارسال کنیم اما در مورد ارسال فایل مشکل وجود داشت و ای جکس (آبجکت XHR مخفف XMLHttpRequest) نمی توانست از این قابلیت پشتیبانی کند و متد مناسبی که مرورگرهای استاندارد از آن پشتیبانی کنند عملا وجود نداشت، تا مدتها برای کاربران گزینه های جایگزین دیگری در دسترس بود از جمله استفاده از کتابخانه های جاوا اسکریپتی نظیر جی کئوری (jQuery) و موتولز (Mootools) که با جلوه ها و محیط کاربری زیبا می توانستند فایل ها را آپلود کنند، هنوز هم این روش ها در موارد خاص خود کاربرد دارند اما مهم بود که ای جکس صرف نیز بتواند عملیات آپلود فایل را برای برنامه های تحت وب انجام دهد، این نیاز رفته رفته باعث توسعه API جدیدی تحت عنوان FormData شد که از طریق آن می توانیم تمام مواردی که از طریق تگ form در صفحات HTML به سرور ارسال کنیم را با ای جکس انجام دهیم، از آنجایی که برخی مرورگرهای قدیمی از آبجکت های این API به درستی پشتیبانی نمی کنند در این آموزش علاوه بر روش اصلی از روشی شبیه سازی شده بر اساس فرایند ای جکس اما مبتنی بر جاوا اسکریپت و تکنیک iframe نیز استفاده خواهیم کرد.

آپلود فایل با استفاده از آبجکت های FormData و Ajax


نیاز وب مدرن و تکیه بیشتر برنامه ها به شیوه ای جکس معرفی API جدیدی تحت عنوان FormData را با هدف رفع نواقص موجود درپی داشت که به کمک آبجکت های آن می توانیم همان طور که در شیوه متداول فرم های وب را از سمت کاربر به سرور ارسال می کنیم با ای جکس نیز این کار را انجام دهیم، در آبجکت های FormData اطلاعات به صورت کلید و مقدار تنظیم و در نهایت با متد XMLHttpRequest.send قابل ارسال هستند، کلید نام فیلدها و مقدار داده ای است که ارسال می شود و می تواند از نوع رشته، عدد، آرایه، فایل و... باشد، در ادامه نحوه آپلود فایل بدون رفرش صفحه با FormData و Ajax را بررسی می کنیم.

کد HTML برای آپلود فایل با FormData و Ajax


اولین قسمتی که برای ایجاد امکان آپلود فایل با FormData و Ajax مورد نیاز است کدنویسی سمت کاربر با استفاده از تگ form در HTML است که در نمونه صفحه زیر این کار را انجام داده ایم، این فایل را با نام index.html ذخیره می کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | آپلود فایل بدون رفرش صفحه با formdata</title>
<!-- Webgoo.ir -->
</head>
<body>
<noscript>جاوا اسکریپت در مرورگر شما غیر فعال است!</noscript>
<form id="upload-form" class="inline" action="ajax-formdata-upload.php" method="post" enctype="multipart/form-data">
<label for="user-file">انتخاب فایل:</label>
<input type="file" id="user-file" name="user-file" onchange="uploadInfo(0);">
</form>
<button class="inline" onclick="uploadStart('upload-form', 'user-file');">آپلود فایل</button>
<div id="file-name"></div>
<div id="file-size"></div>
<div id="file-type"></div>
<div id="upload-process"></div>
<div id="upload-result"></div>
<hr>
نکته: این برنامه صرفا جنبه آموزشی داشته و استفاده از آن بدون تسلط بر PHP و توابع مربوط به فایل، توصیه نمی شود.
<br><br>
[توسعه یافته توسط <a href="https://webgoo.ir" title="وبگو | آموزش برنامه نویسی و مهارتهای وب" target="_blank">Webgoo.ir</a>]
</body>
</html>
توضیح:
- همان طور که مشخص است در قسمت action فرم آدرس فایل PHP تنظیم شده است،البته در تکنیک ای جکس این قسمت لازم نیست و URL اصلی در متد open درج می شود که در ادامه خواهیم دید.
- تگ form باید یک ID منحصربفرد داشته باشد، از این آی دی برای انتخاب فرم در هنگام فراخوانی FormData استفاده خواهیم کرد.
- فایل از طریق تگ input از نوع file برای آپلود انتخاب می شود، با انتخاب فایل توسط کاربر رویداد onchange اجرا و تابع جاوا اسکریپتی uploadInfo با آرگیومنت 0 فراخوانی می شود، همان طور که مشخص است تگ فایل نیز یک ID خاص دارد که در کدهای جاوا اسکریپت از آن استفاده خواهیم کرد.
- برای شروع فرایند آپلود دکمه از نوع button در نظر گرفته ایم که پس از کلیک کاربر تابع uploadStart را فراخوانی می کند، این تابع دو آرگیومنت دارد که به ترتیب آی دی فرم و آی دی تگ مربوط به فایل است.
- برای مدیریت اطلاعاتی که قبل، حین و پس از آپلود می توانیم به کاربر نمایش دهیم تگ های div در نظر گرفته ایم که هر کدام آی دی مخصوص به خود دارند.

کد CSS و جاوا اسکریپت آپلود فایل با FormData و Ajax


کدهای HTML به تنهایی صرفا چارچوب اولیه برنامه را تشکیل می دهند و جلوه های ظاهری و تعاملی و همچنین امکان آپلود به صورت بدون رفرش صفحه به کمک استایل CSS و کدنویسی جاوا اسکریپت امکانپذیر می شود که در نمونه زیر این کار را انجام داده ایم، این کدها را قبل از بسته شدن تگ head در فایل index.html اضافه می کنیم:
<style>
body {
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
a{
    text-decoration:none;
    color:#06C;
}
a:hover {
    color:#666;
}
.inline {
    display:inline-block;
}
.ok {
    display:block;
    padding:4px;
    border:0px #666 solid;
    color:#090;
    width:300px;
}
.error {
    display:block;
    padding:4px;
    border:0px #666 solid;
    color:#C00;
    width:300px;    
}
</style>
<script>
function uploadInfo(clear){
    var file = document.getElementById('user-file').files[0];
    var elm_name = document.getElementById('file-name');
    var elm_size = document.getElementById('file-size');
    var elm_type = document.getElementById('file-type');
    var elm_process = document.getElementById('upload-process');
    var elm_result = document.getElementById('upload-result');

    if(file && clear === 0){
        var file_size = 0;
        
        if(file.size > 1024 * 1024){
            file_size = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
        } else{
            file_size = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
        }
          
        elm_name.innerHTML = 'Name: ' + file.name;
        elm_size.innerHTML = 'Size: ' + file_size;
        elm_type.innerHTML = 'Type: ' + file.type;
        elm_process.innerHTML = '';
        elm_result.innerHTML = '';
    } else{
        elm_name.innerHTML = '';
        elm_size.innerHTML = '';
        elm_type.innerHTML = '';
    }
}

function uploadStart(form_id, file_id){
    if(document.getElementById(file_id).value != ''){
        var xhr = new XMLHttpRequest();
        var form = document.getElementById(form_id);
        var fd = new FormData(form);

        xhr.upload.addEventListener("progress", uploadProgress, false);
        xhr.addEventListener("abort", uploadCanceled, false);
        xhr.addEventListener("error", uploadFailed, false);
        xhr.addEventListener("load", uploadEnd, false);

        xhr.open("POST", "ajax-formdata-upload.php");
        xhr.send(fd);
    } else{
        alert('لطفا ابتدا یک فایل انتخاب کنید!');
    }
    
    return false;
}

function uploadProgress(evt){
    if(evt.lengthComputable){
        var percent_complete = Math.round(evt.loaded * 100 / evt.total);
        document.getElementById('upload-process').innerHTML = percent_complete.toString() + '%';
    } else{
        document.getElementById('upload-process').innerHTML = 'محاسبه درصد آپلود ممکن نیست!';
    }
}

function uploadCanceled(evt){
    alert("آپلود فایل توسط کاربر منتفی یا مرورگر ارتباط را قطع کرد!");
}

function uploadFailed(evt){
    alert("بروز خطا در فرآیند آپلود فایل!");
}

function uploadEnd(evt){
    var result = evt.target.responseText;
    document.getElementById('upload-result').innerHTML = result;
    uploadInfo(1);
}
</script>
توضیح:
- در استایل CSS این نمونه کد جهت جلوگیری از پیچیده شدن کار صرفا چند کلاس ساده در نظر گرفته ایم که ویژگی های کلی صفحه و رنگ متن خطا یا پیغام آپلود موفق را مشخص می کند، قاعدتا برای استفاده کاربردی از برنامه می توانیم بر اساس سلیقه این قسمت را تکمیل کنیم.
- کدهای جاوا اسکریپت شامل چند تابع با نامگذاری دلخواه uploadInfo، uploadStart، uploadProgress، uploadCanceled، uploadFailed و uploadEnd است که هر کدام در مرحله و تحت شرایط خاصی فراخوانی می شوند.
- تابع uploadInfo در دو قسمت و با دو مقدار مختلف (0 یا 1 برای آرگیومنت clear) فراخوانی می شود، پس از انتخاب فایل توسط کاربر رویداد onchange اجرا شده و تابع با آرگیومنت 0 فراخوانی می شود، 0 در اینجا یعنی اطلاعات مربوط به فایل (نام، اندازه و نوع) در بلاک های div در نظر گرفته شده نمایش داده شود، اگر این مقدار 1 باشد اطلاعات این بلاک ها حذف می شود که این کار در پایان فرآیند آپلود در تابع uploadEnd صورت می گیرد.
- uploadStart تابع اصلی برنامه است که وظیفه فراهم سازی ساز و کار ارسال درخواست ای جکس و آپلود فایل با آبجکت FormData را بر عهده دارد، این تابع دو آرگیومنت دارد که به ترتیب آی دی فرم و آی دی فیلد فایل را مشخص می کند، تابع uploadStart پس از کلیک کاربر بر روی دکمه آپلود فراخوانی می شود، نکته مهم در این تابع استفاده از addEventListener برای اختصاص عملیات هایی در هنگام تغییر وضعیت رویدادهای درخواست ای جکس است که شامل دریافت مقادیر درصدی آپلود شده (رویداد progress)، منتفی شدن آپلود (رویداد abort)، بروز خطا (رویداد error) و پایان فرآیند آپلود (رویداد load) است، در هر کدام از این رویدادها تابع متناظر با آن فراخوانی می شود.
- تابع uploadProgress برای محاسبه و نمایش مقدار حجم آپلود شده به صورت کیلوبایت، درصد و... است، در این تابع از دو متد loaded و total استفاده کرده ایم، مقادیر در این دو متد بر اساس بایت است که با محاسبات ساده ریاضی در نهایت میزان پیشرفت فرآیند آپلود را به صورت درصدی نمایش می دهیم، قاعدتا با در اختیار داشتن مقدار عددی حجم آپلود شده در لحظه می توانیم شکل ظاهری کار را به نحو دلخواه و سفارشی طراحی کنیم، به فرض بلاکی با رنگ متمایز برای خط آپلود (Progress Bar) کدنویسی و با جاوا اسکریپت (متد style) میزان عرض بلاک را متناسب با درصد آپلود شده به روز کنیم.
- توابع uploadCanceled و uploadFailed برای مواردی است که یا آپلود توسط کاربر متوقف می شود یا اینکه به هر دلیل اشکالی در فرآیند وجود داشته که آپلود کامل نمی شود.
- در صورت آپلود موفق در نهایت تابع uploadEnd فراخوانی می شود، این تابع پاسخ سرور را در بلاک div هدف چاپ و با فراخوانی مجدد تابع uploadInfo با مقادیر 1 برای آرگیومنت clear موارد اضافه موجود در صفحه را نیز حذف می کند.

کد PHP برای پردازش فایل آپلود شده با FormData و Ajax


ساختارهای برنامه های وب معمولا از دو بخش اصلی سمت کاربر و سمت سرور تشکیل شده اند که تا اینجا کدهای سمت کاربر (HTML، JavaScript و Ajax) را نوشتیم، در گام بعدی در فایلی با نام دلخواه ajax-formdata-upload.php دستورات زیر را درج می کنیم تا مرحله بررسی و ذخیره سازی فایل آپلود شده در حافظه هارد دیسک سرور به درستی انجام شود:
<?php
//برای جلوگیری از خطاهای ناخواسته موارد زیر در فایل php.ini بررسی و مطابق نیاز تنظیم شده باشند:
/*
file_uploads = برابر On یا 1 تنظیم شده باشد.
upload_max_filesize = حداکثر حجم معتبر فایل، آپلود فایل های بزرگتر توسط PHP رد می شود!
post_max_size = حداکثر حجم معتبر ارسال داده در متد POST، باید بیشتر از پارامتر upload_max_filesize تعیین شود.
max_file_uploads = حداکثر تعداد فایل قابل آپلود در یک ارسال.
*/


//فرمت های مجاز
$valid_extension = array('jpg', 'png', 'gif');

//نوع فایل های مجاز
$valid_mime = array('image/jpeg', 'image/png', 'image/gif');

//تعیین فرمت، نوع فایل یا اندازه مجاز و سایر پارامترها
if(in_array(pathinfo($_FILES["user-file"]["name"], PATHINFO_EXTENSION), $valid_extension) && in_array($_FILES["user-file"]["type"], $valid_mime) && $_FILES["user-file"]["size"] < 1048576) {
    //بررسی سایر خطاهای سرور
    if ($_FILES["user-file"]["error"] > 0) {
        echo '<div class="error">خطا: ' . $_FILES["user-file"]["error"] . '</div><br>';
    } //بررسی وجود یا عدم وجود فایل با نام مشابه در سرور    
    else {
        if(file_exists('user-files/' . $_FILES["user-file"]["name"])) {
            echo '<div class="error">این فایل در حال حاضر وجود دارد!</div><br>';
        } //انتقال و ذخیره فایل در سرور    
        else {            
            if(move_uploaded_file($_FILES["user-file"]["tmp_name"], 'user-files/' . $_FILES["user-file"]["name"])) {
                echo '<div class="ok">فایل با موفقیت آپلود شد!</div><br>';
                echo 'فایل: ' . $_FILES["user-file"]["name"] . '<br>';
                echo 'نوع: ' . $_FILES["user-file"]["type"] . '<br>';
                echo 'اندازه: ' . ($_FILES["user-file"]["size"] / 1024) . ' Kb<br>';
                echo 'دایرکتوری: user-files/' . $_FILES["user-file"]["name"]. '<br>';
            } else {
                echo '<div class="error">ذخیره سازی فایل در سرور با مشکل مواجه شد!</div><br>';
            }
        }
    }
} //خطای تعیین فرمت، نوع یا اندازه مجاز و سایر پارامترها
else {
    //print_r( $_FILES["user-file"]);
    
    if($_FILES["user-file"]["size"] > 1048576) {
        echo '<div class="error">حجم فایل خیلی زیاد است! اندازه مجاز 1 مگابایت.</div>';
    } else {
        echo '<div class="error">فرمت یا نوع فایل مجاز نیست!</div>';
    }
}
?>
توضیح:
- برای دریافت فایل آپلود شده در PHP از متغیر از پیش تعریف شده FILES که به صورت آرایه است استفاده می کنیم، کلید اول آرایه نام فیلد input است که فایل در آن انتخاب و ارسال می شود، کلید دوم آرایه پارامترهای مربوط به نام، نوع، حجم، اندازه و... فایل آپلود شده است.
- پارامترهای فایل آپلود شده در آرایه FILES می تواند شامل موارد زیر باشد:
<?php
//نام فایل آپلود شده
$_FILES['user-file']['name'];
//نوع MIME فایل مانند image/jpeg
$_FILES['user-file']['type'];
//حجم فایل به بایت
$_FILES['user-file']['size'];
//نام موقت فایل در سرور
$_FILES['user-file']['tmp_name'];
//شماره خطای برگردانده شده توسط سرور
$_FILES['user-file']['error'];
?>
- خطاهای مربوط به کار با فایل اعدادی از 1 تا 8 هستند، اگر همه چیز درست باشد عدد صفر برگردانده می شود، در زیر به طور مختصر به این خطاها اشاره می کنیم:
UPLOAD_ERR_OK: عدد 0 برگردانده می شود و این به معنی عدم خطا است.
UPLOAD_ERR_INI_SIZE: عدد 1 برگردانده می شود، فایل آپلود شده از حداکثر حجم تنظیم شده در تنظیمات php.ini بیشتر است.
UPLOAD_ERR_FORM_SIZE: عدد 2 برگردانده می شود، فایل آپلود شده از حداکثر حجم تنظیم شده در فرم HTML بیشتر است (در فرم HTML می توانیم فیلد مخفی با نام MAX_FILE_SIZE داشته باشیم و در قسمت value حداکثر حجم مجاز را به بایت تعیین کنیم، البته در حال حاضر این روش قابل اطمینان نیست و باید حتما در سرور مجدد اعتبارسنجی با PHP صورت گیرد).
UPLOAD_ERR_PARTIAL: عدد 3 برگردانده می شود، فایل به صورت ناقص آپلود شده است.
UPLOAD_ERR_NO_FILE: عدد 4 برگردانده می شود، هیچ فایلی آپلود نشد.
UPLOAD_ERR_EMPTY: عدد 5 برگردانده می شود، فایل آپلود شده صفر بایت است یا فیلد خالی می باشد.
UPLOAD_ERR_NO_TMP_DIR: عدد 6 برگردانده می شود (تنها در نسخه 4.3.10 و بالاتر)، مفسر PHP نمی تواند پوشه tmp را پیدا کند.
UPLOAD_ERR_CANT_WRITE: عدد 7 برگردانده می شود (تنها در نسخه 5.1.0 و بالاتر)، مفسر PHP نمی تواند فایل را ذخیره کند.
UPLOAD_ERR_EXTENSION: عدد 8 برگردانده می شود (تنها در نسخه 5.2.0 و بالاتر)، یکی از الحاقات PHP مانع آپلود فایل شده است، استفاده از ()phpinfo ممکن است به رفع مشکل کمک کند.
- برای بررسی پسوند (Extension) فایل ها از تابع pathinfo با آرگیومنت PATHINFO_EXTENSION استفاده می کنیم.
- علاوه بر بررسی پسوند فایل باید نوع MIME آن را نیز بررسی کنیم، بدین منظور از پارامتر type برای FILES استفاده می کنیم.
- اندازه مجاز تعیین شده در این نمونه کد 1 مگابایت (معادل 1048576 بایت) است.
- تابع file_exists بررسی می کند که آیا فایل ارسال شده از قبل در دایرکتوری مورد نظر وجود دارد یا خیر.
- اگر همه چیز درست باشد نهایتا PHP با تابع move_uploaded_file فایل را در دایرکتوری مورد نظر (در اینجا فولدر user-files) ذخیره می کند.

دانلود کد آپلود فایل با PHP به شیوه FormData و Ajax


در لینک زیر کدهای بالا را به اضافه تنظیمات کاملتر در یک بسته جهت دانلود قرار داده ایم، پس از دریافت فایل کافی است آن را روی لوکال هاست یا سرور اجرا کنیم:
دانلود کد آپلود فایل با PHP به شیوه FormData و Ajax - حجم: کمتر از 5 کیلوبایت
نکته: این برنامه صرفا جنبه آموزشی داشته و استفاده از آن بدون تسلط بر PHP و توابع مربوط به فایل توصیه نمی شود.

آپلود فایل با استفاده از ترکیب جاوا اسکریپت و تکنیک iframe


اگرچه امروزه استفاده از API جدیدتر FormDate و ارسال مقادیر فرم در بستر ای جکس روش بهینه و مورد پسند توسعه دهندگان وب است و توسط اغلب مرورگرها پشتیبانی می شود اما ممکن است به دلایلی از جمله استفاده اغلب کاربران یک برنامه از مرورگرهای قدیمی و عدم پشتیبانی کامل این مرورگرها از آبجکت های زیر مجموعه FormDate یا به دلایل دیگر همچنان نیاز به روش های جایگزین مانند ترکیب جاوا اسکریپت و تکنیک iframe احساس شود، به همین دلیل جهت آشنایی بیشتر در ادامه آموزش این روش را نیز بررسی می کنیم.
ajax-file-uploading.jpg

کد HTML برای آپلود فایل با تگ iframe


در شیوه iframe فرم آپلود به صورت فریم در صفحه اصلی قرار می گیرد، به این صورت با کمک جاوا اسکریپت می توانیم فرآیند ارسال فرم را در بستر فریم داخلی انجام دهیم تا صفحه اصلی تغییر نکند و به اصطلاح رفرش نشود، بدین منظور نمونه فرم HTML زیر را در فایلی با نام index.html کدنویسی کرده ایم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | آپلود فایل بدون رفرش صفحه با iframe</title>
<!-- Webgoo.ir -->
</head>
<body>
<noscript>جاوا اسکریپت در مرورگر شما غیر فعال است!</noscript>
<form action="ajax-iframe-upload.php" method="post" enctype="multipart/form-data" target="upload-target" onsubmit="return uploadStart(this.form, 'user-file');">
<label for="user-file"></label>
<input type="file" id="user-file" name="user-file">
<input type="submit" value="آپلود فایل">
</form>
<div id="upload-process"><img src="loading.gif" height="16" width="16" alt="loading"> در حال پردازش...</div>
<div id="upload-form"></div>
<iframe id="upload-target" name="upload-target" class="frame"></iframe>
</body>
</html>
توضیح:
- در قسمت action فرم، آدرس فایل PHP یا URL مقصد را درج می کنیم، فایل های آپلود شده به این آدرس ارسال، پردازش و مدیریت می شوند.
- در قسمت متد ارسال فایل از متد POST استفاده خواهیم کرد، متد POST برخلاف GET برای ارسال پارامترها در پس زمینه (بدون امکان روئیت) کاربرد دارد.
- بخش مربوط به enctype (مخفف Encoding Type) و مقادیر multipart/form-data این امکان را به مرورگر خواهد داد تا فایل را به صورت بخش بخش شده به سرور انتقال دهد، در حالت معمول و به طور پیش فرض مرورگر از مقادیر application/x-www-form-urlencoded استفاده می کند که برای انتقال فایل و داده های حجیم مناسب نیست.
- قسمت مربوط به target به جهت استفاده از تکنیک iframe قرار داده شده که مقادیر آن در واقع آی دی iframe (در اینجا upload-target) است، گفتیم که در روش فریم فایل از طریق تگ iframe و بدون رفرش صفحه اصلی ارسال می شود، لذا بستر ارسال فرم را با پارامتر target تعیین می کنیم.
- قسمت onsubmit و مقادیر آن مربوط به فراخوانی تابع جاوا اسکریپتی است که هنگام ارسال فرم اجرا می شود و وظیفه اعتبارسنجی خالی نبودن فیلد فایل و تغییر استایل بلاک مربوط به نمایش پیام ها به حالت visible (قابل روئیت) را برعهده دارد.
- برای ایجاد امکان انتخاب و ارسال فایل باید از تگ input و نوع file استفاده کنیم، ذکر این نکته لازم است که مقادیر و استایل دکمه انتخاب فایل (Choose File) به صورت پیش فرض توسط مرورگرها تعیین می شود و برای تغییر آن باید از تکنیک CSS و جاوا اسکریپت استفاده کرد.
- نهایتا با در نظر گرفتن دکمه از نوع submit فرم را ارسال می کنیم، نکته مهم اینکه نوع دکمه ارسال فایل باید حتما submit باشد چون برای اجرای تابع جاوا اسکریپتی خود از رویداد onsubmit استفاده کرده ایم.
- بلاک های div که در پائین تگ form ایجاد کرده ایم برای مدیریت نمایش پیام در حال پردازش، پیغام خطا یا موفقیت آمیز بودن فرآیند آپلود و انتقال فایل به سرور است.
- تگ iframe را نیز برای دریافت پیام سرور بعد از آپلود فایل در قسمت انتهایی کدها در نظر گرفته ایم که دلخواه و قابل سفارشی سازی است.

کد CSS و جاوا اسکریپت در تکنیک آپلود با iframe


برای اینکه برنامه ما به صورت دلخواه و به درستی کار کند باید تنظیمات و کنترل کاملتری روی آن اعمال کنیم، بدین منظور از کدهای CSS جهت سفارشی سازی ظاهر کار و برنامه نویسی جاوا اسکریپت (JavaScript) جهت مدیریت رفتارهای تعاملی و ارسال فایل و دریافت پاسخ به شکل زیر در فایل index.html استفاده می کنیم:
<style>
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
a{
    text-decoration:none;
    color:#06C;
}
a:hover{
    color:#666;
}
.ok {
    display:block;
    padding:4px;
    border:0px #666 solid;
    color:#090;
    width:300px;
}
.error {
    display:block;
    padding:4px;
    border:0px #666 solid;
    color:#C00;
    width:300px;    
}
#upload-process{
    z-index:1000;
    visibility:hidden;
}
.frame{
    width:300px;
    height:100px;
    border:0px;    
}
</style>
<script>
function uploadStart(form, file){
    if(document.getElementById(file).value != ''){
        document.getElementById('upload-process').style.visibility = 'visible';
        return true;
    } else{
        alert('لطفا ابتدا یک فایل انتخاب کنید!');
        return false;
    }
}

function uploadEnd(check){
    var result = '';
      
    if (check == 1){
        result = '<span class="ok">فایل با موفقیت آپلود شد!<\/span>';
    } else {
        result = '<span class="error">انتقال فایل به سرور انجام نشد!<\/span>';
    }
      
    document.getElementById('upload-process').style.visibility = 'hidden';
    document.getElementById('upload-form').innerHTML = result;
}
</script>
توضیح:
- استایل CSS تنظیمات مربوط به ظاهر عناصر HTML را مدیریت می کند و با تغییر در مقادیر کلاس و آی دی به راحتی می توانیم ویژگی های سفارشی را متناسب با سلیقه و نیازمان اعمال کنیم.
- کد جاوا اسکریپت بالا دو تابع ساده دارد، تابع اول با نام uploadStart با کلیک بر روی دکمه ارسال فرم فراخوانی می شود و در صورتی که فیلد فایل خالی نباشد استایل بلاک div با آی دی upload-process را از حالت hidden به حالت مرئی یا visible تبدیل می کند، در تابع دوم (uploadEnd) یک عدد که پس از ارسال فرم از کدهای PHP دریافت می شود را بررسی می کنیم و متناسب با مقدار آن پیام و اطلاعاتی به کاربر نمایش خواهیم داد،اگر این مقدار 1 باشد پیام موفقیت و در غیر اینصورت پیغام خطا تنظیم می شود.
نکته: تابع uploadEnd به صورت داینامیک فراخوانی می شود، یعنی قسمت فراخوانی آن ابتدا در خروجی کدهای صفحه index.html وجود ندارد اما پس از ارسال فرم در انتهای فایل ajax-iframe-upload.php و در فریم چاپ می شود.
- در اینجا برای مقداردهی پیغام ها در بلاک div با آی دی upload-form از متد innerHTML استفاده کرده ایم.

کد PHP برای پردازش فایل آپلود شده در تکنیک iframe


پس از اینکه کاربر فرم را ارسال می کند در سمت سرور باید کدی داشته باشیم که بتواند فایل را دریافت و فرآیند آپلود را مدیریت کند، در PHP متغیر از پیش تعریف شده (Predefined Variable) با نام FILES وجود دارد که بدین منظور مورد استفاده قرار می گیرد، با این توضیح کدهای زیر را در فایلی با نام ajax-iframe-upload.php درج می کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | فایل سرور برای پردازش آپلود</title>
<!-- Webgoo.ir -->
<style>
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
.response-text{
    font-style:italic;
}
</style>
<?php
//برای جلوگیری از خطاهای ناخواسته موارد زیر در فایل php.ini بررسی و مطابق نیاز تنظیم شده باشند:
/*
file_uploads = برابر On یا 1 تنظیم شده باشد.
upload_max_filesize = حداکثر حجم معتبر فایل، آپلود فایل های بزرگتر توسط PHP رد می شود!
post_max_size = حداکثر حجم معتبر ارسال داده در متد POST، باید بیشتر از پارامتر upload_max_filesize تعیین شود.
max_file_uploads = حداکثر تعداد فایل قابل آپلود در یک ارسال.
*/


//فرمت های مجاز
$valid_extension = array('jpg', 'png', 'gif');

//نوع فایل های مجاز
$valid_mime = array('image/jpeg', 'image/png', 'image/gif');

//تعیین فرمت، نوع فایل یا اندازه مجاز و سایر پارامترها
if(in_array(pathinfo($_FILES["user-file"]["name"], PATHINFO_EXTENSION), $valid_extension) && in_array($_FILES["user-file"]["type"], $valid_mime) && $_FILES["user-file"]["size"] < 1048576) {
    //بررسی سایر خطاهای سرور
    if ($_FILES["user-file"]["error"] > 0) {
        echo '<div class="response-text">خطا: ' . $_FILES["user-file"]["error"] . '</div><br>';
        $check = 0;
    } //بررسی وجود یا عدم وجود فایل با نام مشابه در سرور    
    else {
        if(file_exists('user-files/' . $_FILES["user-file"]["name"])) {
            echo '<div class="response-text">این فایل در حال حاضر وجود دارد!</div><br>';
            $check = 0;
        } //انتقال و ذخیره فایل در سرور    
        else {          
            if(move_uploaded_file($_FILES["user-file"]["tmp_name"], 'user-files/' . $_FILES["user-file"]["name"])) {
                echo 'فایل: ' . $_FILES["user-file"]["name"] . '<br>';
                echo 'نوع: ' . $_FILES["user-file"]["type"] . '<br>';
                echo 'اندازه: ' . ($_FILES["user-file"]["size"] / 1024) . ' Kb<br>';
                echo 'دایرکتوری: user-files/' . $_FILES["user-file"]["name"]. '<br>';
                $check = 1;
            } else {
                echo '<div class="response-text">ذخیره سازی فایل در سرور با مشکل مواجه شد!</div><br>';
                $check = 0;
            }
        }
    }
} //خطای تعیین فرمت، نوع یا اندازه مجاز و سایر پارامترها
else {
    //print_r( $_FILES["user-file"]);
    
    if($_FILES["user-file"]["size"] > 1048576) {
        echo '<div class="response-text">حجم فایل خیلی زیاد است! اندازه مجاز 1 مگابایت.</div>';
    } else {
        echo '<div class="response-text">فرمت یا نوع فایل مجاز نیست!</div>';
    }
    
    $check = 0;
}
?>
<script>
window.top.window.uploadEnd(<?php echo $check; ?>);
</script>
</head>
</html>
توضیح:
- برای دریافت فایل آپلود شده در PHP از متغیر از پیش تعریف شده FILES که به صورت آرایه است استفاده می کنیم، کلید اول آرایه نام فیلد input است که فایل در آن انتخاب و ارسال می شود، کلید دوم آرایه پارامترهای مروبط به نام، نوع، حجم، اندازه و... فایل آپلود شده است.
- پارامترهای فایل آپلود شده در آرایه FILES می تواند شامل موارد زیر باشد:
<?php
//نام فایل آپلود شده
$_FILES['user-file']['name'];
//نوع MIME فایل مانند image/jpeg
$_FILES['user-file']['type'];
//حجم فایل به بایت
$_FILES['user-file']['size'];
//نام موقت فایل در سرور
$_FILES['user-file']['tmp_name'];
//شماره خطای برگردانده شده توسط سرور
$_FILES['user-file']['error'];
?>
- خطاهای مربوط به کار با فایل اعدادی از 1 تا 8 هستند، اگر همه چیز درست باشد عدد صفر برگردانده می شود، در زیر به طور مختصر به این خطاها اشاره می کنیم:
UPLOAD_ERR_OK: عدد 0 برگردانده می شود و این به معنی عدم خطا است.
UPLOAD_ERR_INI_SIZE: عدد 1 برگردانده می شود، فایل آپلود شده از حداکثر حجم تنظیم شده در تنظیمات php.ini بیشتر است.
UPLOAD_ERR_FORM_SIZE: عدد 2 برگردانده می شود، فایل آپلود شده از حداکثر حجم تنظیم شده در فرم HTML بیشتر است (در فرم HTML می توانیم فیلد مخفی با نام MAX_FILE_SIZE داشته باشیم و در قسمت value حداکثر حجم مجاز را به بایت تعیین کنیم، البته در حال حاضر این روش قابل اطمینان نیست و باید حتما در سرور مجدد اعتبارسنجی با PHP صورت گیرد).
UPLOAD_ERR_PARTIAL: عدد 3 برگردانده می شود، فایل به صورت ناقص آپلود شده است.
UPLOAD_ERR_NO_FILE: عدد 4 برگردانده می شود، هیچ فایلی آپلود نشد.
UPLOAD_ERR_EMPTY: عدد 5 برگردانده می شود، فایل آپلود شده صفر بایت است یا فیلد خالی می باشد.
UPLOAD_ERR_NO_TMP_DIR: عدد 6 برگردانده می شود (تنها در نسخه 4.3.10 و بالاتر)، مفسر PHP نمی تواند پوشه tmp را پیدا کند.
UPLOAD_ERR_CANT_WRITE: عدد 7 برگردانده می شود (تنها در نسخه 5.1.0 و بالاتر)، مفسر PHP نمی تواند فایل را ذخیره کند.
UPLOAD_ERR_EXTENSION: عدد 8 برگردانده می شود (تنها در نسخه 5.2.0 و بالاتر)، یکی از الحاقات PHP مانع آپلود فایل شده است، استفاده از ()phpinfo ممکن است به رفع مشکل کمک کند.
- برای بررسی پسوند (Extension) فایل ها از تابع pathinfo با آرگیومنت PATHINFO_EXTENSION استفاده می کنیم.
- علاوه بر بررسی پسوند فایل باید نوع MIME آن را نیز بررسی کنیم، بدین منظور از پارامتر type برای FILES استفاده می کنیم.
- اندازه مجاز تعیین شده در این نمونه کد 1 مگابایت (معادل 1048576 بایت) است.
- تابع file_exists بررسی می کند که آیا فایل ارسال شده از قبل در دایرکتوری مورد نظر وجود دارد یا خیر.
- اگر همه چیز درست باشد نهایتا PHP با تابع move_uploaded_file فایل را در دایرکتوری مورد نظر (در اینجا فولدر user-files) ذخیره می کند.

دانلود کد آپلود فایل با PHP به شیوه iframe


در لینک زیر کدهای بالا را به اضافه تنظیمات کاملتر در یک بسته جهت دانلود قرار داده ایم، پس از دریافت فایل کافی است آن را روی لوکال هاست یا سرور اجرا کنیم:
دانلود کد آپلود فایل با PHP به شیوه iframe - حجم: کمتر از 5 کیلوبایت
نکته: این برنامه صرفا جنبه آموزشی داشته و استفاده از آن بدون تسلط بر PHP و توابع مربوط به فایل توصیه نمی شود.
sectionدسته بندی: آموزش کاربردی » Ajax
related مطالب بیشتر:
» نمایش داینامیک و صفحه به صفحه مطالب با ای جکس (Ajax)
» لیست داینامیک پیشنهاد کلمات، مبتنی بر ای جکس، PHP و MySQL
» نمایش نتایج پایگاه داده MySQL با PHP و ای جکس (Ajax)
» ساخت قابلیت امتیازدهی با PHP و Ajax
» اعتبار سنجی همزمان فرم با آژاکس (Ajax) و PHP
commentنظرات (۱۳۶ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: هادی
زمان: ۱۲:۴۲:۴۷ - تاریخ: ۱۳۹۱/۰۴/۱۰
سلام با تشکر از آموزشتان در قسمت نوع فایل چگونه می توانم پسوند های زیپ را اضافه کنم
پاسخ: 
سلام
در قسمت تعیین فرمت، با توجه به نوع فایل zip، از type های زیر استفاده کنید:
application/zip
application/x-zip-compressed
multipart/x-zip
application/x-compressed
application/octet-stream
معمولا application/zip کافی خواهد بود با این حال برای اطمینان، از سایر type ها هم می توانید استفاده کنید.
نویسنده: هادی
زمان: ۲۲:۳۵:۰۹ - تاریخ: ۱۳۹۱/۰۴/۱۱
سلام
سپاس از جوابتان بله مورد اول جواب داد با تشکر
سوالی دارم البته مربوط به این قسمت نمیشه
1- فرمی طراحی نمودم که درصورتی که فیلدها پر نشوند در صفحه دیگری پیغام اجبار به پر کردن موارد را بدهد حال چگونه همین پیغام در کنار همان فیلد ها نمایش داده شود و به صفحه دیگر ارجاع داده نشود؟
2- در فرممان 3 مورد را مشخص نموده ایم که میخواهیم در صورت انتخاب هرکدام جمع آن موارد بصورت مبلغی که مشخص می شود در محل بخصوصش ثبت شود چه دستوری باید نوشت؟
3- با هر تغییری که داده ام در دیتابیس mysql فارسی ثبت نمی شود درحالی که شیوه ثبت را utf8 یا latin1 قرار دادم ولی تاثیری نداشت.
پاسخ: 
سلام
در مورد سوال اول، دو راه وجود دارد، استفاده از آژاکس یا استفاده از جاوا اسکریپت و رویداد های onchange یا onfocus و عنصر document.getElementById، جمع و تفریق هم با برنامه نویسی جاوا اسکریپت به راحتی میسر است، نمونه کد را در لینک زیر مشاهده کنید:
بررسی اعتبار فیلد و جمع و تفریق با جاوا اسکریپت
در مورد سوال سوم، دیتابیس به طور معمول حروف فارسی را به صورت ناخوانا ذخیره می کند، اگر در هنگام خروجی و نمایش، حروف به فارسی هستند، پس مشکلی نیست، تا آنجا که ما می دانیم، برای تمام سایت های فارسی زبان، به همین شکل است!
نویسنده: هادی
زمان: ۱۲:۲۴:۰۶ - تاریخ: ۱۳۹۱/۰۴/۱۲
سلام مجدد دیتابیس حروف فارسی را به شکل دیگه نمایش میده و خروجی اش هم همینطور بطور مثال:
هادی برای اسم وارد شده بصورت فارسی هست.
پاسخ: 
بهتر است برای دیتابیس، جداول و ردیف ها از utf8_general_ci برای COLLATE ها استفاده کنید (قبل از اینکه اطلاعاتی ذخیره شود)، در تمام صفحات HTML نیز متاتگ زیر را در قسمت تگ head قرار دهید:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
معمولا نباید مشکل دیگری باشد.
نویسنده: هادی
زمان: ۱۲:۲۸:۳۲ - تاریخ: ۱۳۹۱/۰۴/۱۲
این نمونه دستورات دیتا بیس هست
CREATE TABLE IF NOT EXISTS `users` (
`u_id` int(11) NOT NULL AUTO_INCREMENT,
`u_code` varchar(40) COLLATE latin1_general_ci NOT NULL DEFAULT '',
`u_fname` varchar(40) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL DEFAULT ''
PRIMARY KEY (`u_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=73 ;
نویسنده: جکسون
زمان: ۱۲:۲۷:۳۷ - تاریخ: ۱۳۹۱/۰۴/۲۹
بسیار ممنون از زحمات شما
نویسنده: محمد
زمان: ۱۲:۲۲:۲۷ - تاریخ: ۱۳۹۱/۰۵/۱۰
سلام
چه طور میتونیم لینک دانلود برای فایلهایی که کاربران بر روی سایت آپلود میکنند ، در قسمت مدیریت سایت قرار دهیم تا مدیران به راحتی فایلهای ارسالی کاربران را دیده و در صورت نیاز آنها را دانلود نمایند؟
(آپلود رو بلدم ولی دانلود رو نه) مرسی
پاسخ: 
سلام
سوال شما خیلی کلی است و نمی توان پاسخ روشنی به آن داد، این موضوع بستگی به نحوه کدنویسی سیستم آپلود سایت و ارتباط دادن آن با بخش مدیریت دارد، در مجموع اولین راه حلی که به ذهن می رسد این است که باید هنگام آپلود فایل توسط کاربران، لینک فایل های ایجاد شده در سرور را در یک جدول پایگاه داده ذخیره کرده و از آنها در بخش مدیریت استفاده نمود.
نویسنده: محمد
زمان: ۱۴:۱۵:۱۵ - تاریخ: ۱۳۹۱/۰۵/۱۰
ممنون بابت پاسختون
من دقیقا همین کار رو کردم بدین نحو که آدرس ذخیره فایل رو در یک فیلد بنام مسیر در پایگاه ذخیره کردم (هم مسیر فایل هم اسم فایل) .حالا تو قسمت مدیریت سایت اومدم اطلاعات اون جدول رو واکشی کردم و مسیر رو به این صورت نوشتم ولی وقتی روی لینک ایجاد شده کلیک میکنم صفحه ارور 404 باز میشه و میگه صفحه رو پیدا نمیکنه.
echo "<td align='center'><a href='".$row['path_file']."'>لینک</a></td></tr>";
آدرس در بانک به این صورت ذخیره شده :
./files/code_user/myfile.docx
نویسنده: محمد
زمان: ۱۴:۵۹:۴۲ - تاریخ: ۱۳۹۱/۰۵/۱۰
اون مشکل لینک حل شد.اون ارور به خاطر فارسی بودن نام فایل رخ میداد.با فایل دیگه امتحان کردم حل شد.فقط الان یه مشکلی که هست اینه که همه فایلی رو آپلود نمیکنه مثلا یه فایل پی دی اف انتخاب کردم ارور نداد ولی آپلودم نکرد.ولی فایل زیپ و ورد امتحان کردم شد. میخواستم ببینم آیا توی آپلود محدودیت حجم فایل داریم ؟ یعنی تا چه حجمی رو میتونیم تو لوکال هاست آپلود نماییم ؟ مثلا اون دو تا فایلی که آپلود شدند حجم خیلی کم داشتند در حد 20 کیلوبایت ولی پی دی اف که آپ نشد حجمش 2 مگابایت بود. ممنون
پاسخ: 
حداکثر حجم مجاز برای آپلود، بستگی به تنظیمات سرور دارد، به طور پیش فرض php برای آپلود فایل حداکثر تا 2 مگابایت و برای ارسال محتوا از طریق متد post حداکثر تا 8 مگابایت حجم را قبول می کند، برای اینکه این تنظیمات را تغییر دهید باید فایل اصلی php.ini را در لوکال هاست پیدا کنید، این فایل معمولا در قسمت apache و bin وجود دارد، توجه کنید در برخی برنامه ها ممکن است به چند فایل php.ini برخورد کنید، فایلی را باید ویرایش کنید که تاثیر مستقیم بر روی سرور محلی دارد که معمولا همان فایل داخل پوشه apache است، قسمت مربوط به upload_max_filesiz را پیدا کنید و مقادیر آن را تغییر دهید، برای تغییر مقادیر post نیز می توانید قسمت post_max_size را تغییر داده و سپس سرور را مجددا راه اندازی کنید.
در سرور های اشتراکی نیز از htaccess. استفاده کرده و مقادیر زیر را در آن قرار دهید:
php_value upload_max_filesize 12M
php_value post_max_size 12M
نویسنده: فريبا
زمان: ۱۱:۴۶:۱۶ - تاریخ: ۱۳۹۱/۰۵/۱۶
سلام
از سايت خوبتان ممنونم.
سوال: اگر بخوايم فايل هاي را كه آپلود كرديم حالا دانلود كنيم چي كدي بايد بنويسيم؟
ممنون.
پاسخ: 
سلام
با استفاده از اطلاعات دایرکتوری فایل و نام آن، می توانید مقادیر را به صورت یک لینک در دیتابیس ذخیره کرده و از آن استفاده کنید، به فرض اگر نام فایل و دایرکتوری به صورت زیر باشد:
user-upload/image-for-upload.jpg 
یعنی فایل در فولدر user-upload و با نام image-for-upload.jpg ذخیره شده است، لینک آن می تواند به صورت زیر باشد:
<a href="http://www.yoursite.com/user-upload/image-for-upload.jpg">دانلود فایل آپلود شده</a>
نویسنده: سعید
زمان: ۱۸:۲۷:۱۴ - تاریخ: ۱۳۹۱/۰۵/۲۷
سلام و عرض ادب
آیا این امکان هست که ما در سایتمان فایلهایی را که آپلود کرده ایم حذف نماییم ؟ مثلا کاربری یک فایل را در سرور آپلود کرده است حال مدیر سایت بخواهد این فایل را حذف نماید . آیا همچین کاری میشه کرد البته با کدهای php. ممنون
پاسخ: 
سلام
بله این امکان به راحتی وجود دارد، کافی است از تابع unlink استفاده کنید، به طور مثال:
<?php
unlink("user-file.jpg");
?>
تابع unlink تنها به آدرس فایل احتیاج دارد و به راحتی می توانید این آدرس را به صورت داینامیک نیز ایجاد کنید، به طور مثال کد زیر در یک حلقه برای هر فایل موجود در یک دایرکتوری، یک لینک حذف می سازد:
<?php
// آدرس دایرکتوری آپلود
$dirPath = dir("../upload");
// تعریف یک آرایه
$fileArray = array();
// ایجاد آرایه برای حذف فایل ها
while (($file = $dirPath->read()) !== false){
$fileArray[] = trim($file);
}
// پایان خواندن از دایرکتوری
$dirPath->close();
// مرتب سازی و ایجاد لینک برای حذف
sort($fileArray);
$c = count($fileArray);
for($i=0; $i<$c; $i++){
if ($fileArray[$i]){
echo "delete.php?file=$fileArray[$i] <br />";
}
}
?>
اگر کمی با php آشنا باشید، به راحتی می توانید از این کد در برنامه خود استفاده کنید.
نویسنده: سعید
زمان: ۱۲:۴۵:۳۸ - تاریخ: ۱۳۹۱/۰۵/۲۸
ممنون از کمکتون.خیلی لازمش داشتم.
نویسنده: vahed
زمان: ۲۲:۵۳:۴۰ - تاریخ: ۱۳۹۱/۰۶/۲۳
با سلام و خسته نباشید و تشکر از زحماتتان .
مطالبتان خیلی عالی است . و جا دارد از شما ها تشکر کنم. و بی نهایت سپاسگزارم.
اگر امکان دارد در مورد مدیریت پنل و همچنین پرسش(از طرف کاربر) و پاسخ مناسب از طرف مدیر سایت هم مطلب بگذارید.
پاسخ: 
سلام
نظر لطف شماست؛ به تدریج و در آموزش های بعدی به موارد اشاره شده نیز خواهیم پرداخت.
نویسنده: amir
زمان: ۰۱:۱۹:۴۴ - تاریخ: ۱۳۹۱/۰۷/۲۹
با سلام
ممنون از زحماتتون
واقعا دستت درد نکنه
خیلی مفید بود و بدردم خورد
بازم ممنونم.
نویسنده: شهاب
زمان: ۱۲:۰۵:۱۵ - تاریخ: ۱۳۹۱/۰۸/۰۷
با سلام من برنامه آپلود را نوشتم ولی مشکل این است که باید دایرکتوری که فایل در آن کپی می شود مد کامل داشته باشد اگر مد دایرکتوری 777 نباشد فایل آپلود نمی شود چه کار کنم
پاسخ: 
سلام
اجازه آپلود فایل به تنظیمات سرور مربوط می شود، در هر صورت یا باید به طور دستی و در کنترل پنل هاست، مجوزهای ویرایش فولدر را تنظیم کنید یا اینکه از تابع chmod استفاده نمائید، به طور مثال:
<?php
$folder = dirname(__FILE__).'/upload/';
chmod($folder, 0755);
?>
به این صورت مد دایرکتوری فرضی upload بر روی 755 تنظیم می شود.
نویسنده: شهاب
زمان: ۱۰:۱۴:۴۷ - تاریخ: ۱۳۹۱/۰۸/۲۴
ممنون از جوابتان ولی این کد چون از طرف کاربر که ALL user است اجرا می شود قابل اجرا نیست و مد دایرکتوری را عوض نمی کند
پاسخ: 
خیر، وقتی تابع chmod از طرف شما (نویسنده و اجرا کننده کد بر روی سرور) بر روی عدد 0755 تنظیم می شود (می توانید 0777 هم برای مد کامل قرار دهید)، یعنی مدیر تمام اختیارات را دارد و سایر کاربران هم اختیار خواندن و اجرا (read و execute)؛ اما اگر این تابع عمل نمی کند دلیل دیگری دارد که احتمالا به تنظیمات سرور (مانند روشن بودن safe mode) مربوط می شود.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ کوتاه و مختصر داده خواهد شد!
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.





8 × 2
 refresh
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form سحر
در:
سلام من وقتی میخوام توی قسمت صفحات جداگانه وبلاگم گزینه ادامه مطلب رو بیارم باید چیکار کنم چون فقط قسمت نوشته جدید همچین قابلیتی...
۱۵:۰۸:۱۹ ۱۳۹۹/۰۳/۰۸

form علی
در:
با سلام و درود فراوان یه کد جاوا دارم می خوام هر ثانیه نام یه فایل یا پوشه ای رو بگیرم برای مقایسه تا...
۱۱:۰۶:۲۲ ۱۳۹۹/۰۳/۰۸

form علیرضا
در:
با سلام مجدد در پاسخ یکی از کامنت هایم فرمودین که جهت فراخوانی (اجرای) یک فایل در سرور راس ساعت مشخص و صرف...
۱۱:۲۸:۲۴ ۱۳۹۹/۰۳/۰۵

form علیرضا
در:
سلام اگر بخواهیم صفحات سایت رأس ساعت مشخصی مثلا ساعت 12 ظهر رفرش بشه چه کدی رو باید استفاده کنیم. ممنون
۰۴:۴۳:۴۷ ۱۳۹۹/۰۳/۰۵

form علی
در:
با سلام من یه فانکشن نوشتم چطور میشه از توی جاوااسکریپت اون رو صدا بزنم در حقیقت می خوام از توی جاوا یه فانکشنی...
۲۰:۵۹:۰۹ ۱۳۹۹/۰۳/۰۴

form رویا
در:
سلام. خسته نباشید من جدیدا در بلاگفا وبلاگی راه اندازی کردم اما مشکلی دارم. وقتی قسمتی از متن رو انتخاب میکنم و لینک میکنم،...
۱۹:۵۴:۰۰ ۱۳۹۹/۰۳/۰۴

form علی
در:
چطور میشه همزمان با کلیک بر روی «تعویض کد» یعنی کد زیر: پوشه ساخته بشه. با سپاس
۰۹:۵۰:۲۷ ۱۳۹۹/۰۳/۰۳

form علی
در:
با سلام... من یه متغیر تعریف کردم مثلا رو بهش متصل کنیم ممنون از پاسختون.
۰۶:۱۶:۲۷ ۱۳۹۹/۰۳/۰۳

form یاسمن
در:
سلام یه برنامه ای که رشته رو به عنوان password دریافت کنه و کاراکتر فاصله نباشد طول رشته هم از 8 تا 50 باشه عدد...
۱۸:۵۲:۴۴ ۱۳۹۹/۰۳/۰۲

form مرتضی ق
در:
سلام خسته نباشید. یک سایت اصلی و مادر دارم مثلا www.m.com حالا سه سایت دیگر زیر مجموعه مثلا m1 و m2 و m3 من...
۱۸:۲۵:۱۱ ۱۳۹۹/۰۳/۰۲

form میترا
در:
با سلام ببخشید مطلبتون خیلی خوب بود یه سوال من با فتوشاپ انلاین کار می کنم نمی دونم چرا نمی تونم باهاش...
۱۸:۱۵:۱۰ ۱۳۹۹/۰۳/۰۲

form fatemeh
در:
پاراگراف زیر را داریم. چه تنظیماتی در CSS و HTML نیاز است تا در صفحه وببدرستی نمایش داده شود؟ میشه برا جواب این سوال...
۱۶:۳۲:۲۳ ۱۳۹۹/۰۳/۰۱

form علی
در:
با سلام و عرض ادب من یه فانکشن تعریف کردم و کدهای فایل ajax-loading-message.php رو درونش گذاشتم
۰۸:۴۲:۲۱ ۱۳۹۹/۰۳/۰۱

form Maryam
در:
سلام .. من میخاستم کدی بنویسم که خروجی آن دکمه on .. of باشه که با زدن دکمه رنگ پس زمینه تغییر کند ممنون میشم...
۰۲:۲۱:۳۴ ۱۳۹۹/۰۲/۳۱

form amir
در:
سلام ممنون از سایت خوبتون چطور میشه با جاوااسکریپت ایجکس و پی اچ پی بتونم تمامی جدول های دیتابیس رو هر کدوم با یه...
۲۰:۴۵:۵۲ ۱۳۹۹/۰۲/۳۰
form علی
در:
با سلام و عرض ادب بسیار سایت پر محتوایی دارید تبریک... می خواستم بپرسم اگر بخواهیم مثلا کاربر روی یک لینکی در سایت...
۰۷:۲۲:۰۱ ۱۳۹۹/۰۲/۳۰
form Edward ASharp
در:
سلام میشه همين فایلای کاملشو به من بدید؟
۰۰:۰۲:۲۱ ۱۳۹۹/۰۲/۳۰
form میکاییل
در:
سلام من پروزه ای دارم با mvc نوشته شده و در روت سایت فایل htacsess دارم که کد های زیر توشه ...
۰۲:۳۰:۰۲ ۱۳۹۹/۰۲/۲۹
form mahdi
در:
سلام استاد عزیز ، این درسته که با node.js دیگه نیازی به یادگیری php نخواهیم داشت؟
۲۲:۳۹:۳۶ ۱۳۹۹/۰۲/۲۸
form امیر مهدی
در:
سلام ممنونم از اینکه کمکم کردید ولی من منو رو با زیر منوها می خواستم کد شما زیر منوها رو از بین برد. منظور من...
۲۲:۳۰:۱۵ ۱۳۹۹/۰۲/۲۸
form امیر مهدی
در:
سلام. من در طراحی منو سایت با مشکل برخوردم. من منو خودم رو ساختم و متوجه شدم که منو من مقداری فضا از سمت چپ...
۱۹:۲۴:۰۱ ۱۳۹۹/۰۲/۲۸
form امین
در:
خیلی خیلی ممنون از اینکه جواب دادید اما الان که امتحان کردم مجموع همه ی سفارشات رو میزنه یعنی اگر 3 نفر سفارش دادن...
۱۳:۴۶:۵۵ ۱۳۹۹/۰۲/۲۸
form امین
در:
درود به شما خسته نباشید یک سوال داشتم خیلی گشتم اما پیدا نکردم من دیتابیسی برای مثال invert دارم میخوام یک صفحه...
۰۱:۰۰:۴۵ ۱۳۹۹/۰۲/۲۸
form امیر
در:
عالی بود. سپاس گذارم
۱۰:۱۹:۴۴ ۱۳۹۹/۰۲/۲۷
form فرامرز اسماعیلی
در:
سلام خسته نباشید. من داخل ویرایشگرهای notepad++ یا Braket دستور html رو می نویسم یعنی فایل متنی به صورت index.html رو می خواهم اجرا کنم...
۲۲:۴۱:۴۳ ۱۳۹۹/۰۲/۲۶
form پری
در:
سلام بعضی از سایت ها وقتی اهنگ بعدی رو پلی میگنیم اهنگ قبلی که در حال پخش است به طور خودگار قطع میشود میشه این...
۱۴:۲۲:۲۵ ۱۳۹۹/۰۲/۲۶
form ilia Delbar
در:
خیلییییییییییی خوبه! فقط دلم می خواد یه برنامه درست کنم رنگ ها رو نشون بده (رنگ تگ ها)
۱۳:۱۵:۱۹ ۱۳۹۹/۰۲/۲۶
form زهیر صفری
در:
با سلام چطور میتونم تاریخ تولد فرد ایرانی رو بگیره مثلا از input و سن فرد رو در input بعدی نمایش بده میتونید...
۱۲:۳۸:۵۷ ۱۳۹۹/۰۲/۲۶
form حبیب
در:
با سلام بنده از طریق مودم خانه به اینترنت وصل شدم هم با کامپیوتر و هم با موبایل. اما ای پی در هر...
۰۳:۱۲:۵۴ ۱۳۹۹/۰۲/۲۶
form امین
در:
سلام خسته نباشید امیدوارم جوابمو بدید من داخل یک صفحه این کد جاوا رو دارم میخوام خروجی که میده رو داخل...
۱۳:۴۴:۳۳ ۱۳۹۹/۰۲/۲۵
form امیر هادی نجاتی
در:
ممنون از شما. این قسمت (استفاده از جاوا اسکریپت برای غیر فعال کردن کلیک راست) واقعا به دردم خورد .
۲۱:۰۳:۵۰ ۱۳۹۹/۰۲/۲۴
form لیلا
در:
سلام ، ببخشید من میخوام یک مدرک رو در سایت آپلود کنم ولی ارور زیر رو میده . میشه راهنماییم کنید. ممنون
۱۴:۵۲:۴۷ ۱۳۹۹/۰۲/۲۴
form زهرا جعفری
در:
با سلام بنده میخواهم در جاوااسکریپت یک textbox داشته باشم که در آن یک دکمه چشمک زن بذارم وسط متن و وقتی روی...
۱۰:۰۱:۵۱ ۱۳۹۹/۰۲/۲۴
form جواد
در:
سلام. مقادیر و اطلاعاتی از یک سایت دیگه با همین متد file get contents میگیرم که روی لوکال هاست سرعتش خوبه، روی سرور هم بد...
۲۲:۰۳:۲۲ ۱۳۹۹/۰۲/۲۳
form علی رضایی
در:
در خط آخر خطای نحوه ارسال آرگومان می دهد. خطای syntax است یا دستور مورد دارد؟
۱۳:۲۹:۴۹ ۱۳۹۹/۰۲/۲۳
form علی
در:
سلام میخوام مطالب مرتبط با موضوعات سایتم رو در پایین اونها نمایش بدم چجوری میتونم این کار رو بکنم
۰۱:۲۸:۰۰ ۱۳۹۹/۰۲/۲۳
form امیرحسین
در:
با سلام. من تو css میخوام از اتریبیوت border-radius استفاده کنم ولی وقتی مقدارشو مثلا توی div زیاد میذارم متن داخل div بیرون میاد میخواستم...
۱۹:۵۲:۳۰ ۱۳۹۹/۰۲/۲۲
form امیرعلی
در:
با سلام بنده میخواستم بدانم که میشود تگ div را با این روش ها پنهان کرد من میخواهم افزونه ی وردپرسی را...
۱۲:۳۹:۲۶ ۱۳۹۹/۰۲/۲۲
form یوسف رضایی
در:
با سلام و خسته نباشید خواستم بپرسم خروجی یک فرم (با چند گزینه) بر روی برووزر که اماده برای ارسال برای سرور هست را توی...
۱۱:۱۴:۰۳ ۱۳۹۹/۰۲/۲۲
form سعیده
در:
سلام من یه اهنگ که تو وبلاگم میزارم صفحه پخش اهنگ میاد و بلندگوش ولی اون مثلث پلی کنندش نمیاد یعنی عملا واسم...
۱۵:۴۱:۰۵ ۱۳۹۹/۰۲/۲۱
form مجید اسکندری فر
در:
سلام حدود 700 تصویر رو در وبلاگم بارگذاری کردم و حدود 6000 بازدید داشته علت عدم نمایش تصاویر بارگذاری شده در وبلاگم چیست؟ خیلی زحمت...
۱۰:۳۲:۴۵ ۱۳۹۹/۰۲/۲۱
form علیرضا
در:
سلام، ممنون از مطلب کاملتون یه نکته رو هم من اضافه کنم برای کاملتر شدن مقاله، هر آدرس آی پی از یک شناسه هاست...
۰۹:۳۷:۵۰ ۱۳۹۹/۰۲/۲۱
form mahdi
در:
سلام استاد عزیز ، خیلی ممنون از راهنمایی ، انجامشون میدم، فکر میکنم همه این کارارو بلد باشم فقط WYSIWYG رو اصلا نشنیده بودم که...
۰۷:۱۸:۳۷ ۱۳۹۹/۰۲/۲۱
form معصومه
در:
سلام، امروز دیدم که عکس های وبلاگم حذف شده چرا؟ چطور میتونم برشون گردونم؟ عکس ها رو از سایت پیکو فایل آپلود میکردم، هرچقدرم سعی...
۱۴:۵۳:۵۱ ۱۳۹۹/۰۲/۲۰
form mahdi
در:
سلام استاد عزیز و گرامی ، یه درخواستی داشتم ازتون میخوام اگه براتون ممکنه من رو در جاوا اسکریپت بسنجی که بدونم چیا بلدم...
۱۴:۱۸:۵۸ ۱۳۹۹/۰۲/۱۹
form امیر
در:
با سلام، خدمت دوستان عزیز دو جدول به نام‌های Messages و Comments موجود هستند. در جدول Comments فیلدی به نام IDElement وجود دارد که...
۰۵:۲۹:۳۸ ۱۳۹۹/۰۲/۱۹
form ehsan hoseini sianaki
در:
سلام خیلی عالی و کاربردی بود. خسته نباشید.
۲۳:۰۰:۵۱ ۱۳۹۹/۰۲/۱۷
form امید
در:
با سلام و عرض ادب فیلتری میخوام که تعداد جوابهای فیلترهای سایت tse بورس که با جاوا نوشته شده رو بگه مثلا قرار...
۰۰:۱۰:۵۱ ۱۳۹۹/۰۲/۱۷
form احسان
در:
سلام ببخشید من هر کار میکنم تو گوشی اندروید با Html یه عکس رو در سایت خودم بزارم هیچی نمیشه فقط یه علامت عکس میاد...
۲۲:۲۸:۳۷ ۱۳۹۹/۰۲/۱۶
form hasti
در:
سلام . وقت بخیر . میشه مثالی بزنید که right over join برابر با inner join (داخلی) بشه . /با order و customer/ ...
۲۰:۰۵:۱۷ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام مجدد من دیگه اینقدر با این کدها ور رفتم دیوونه شدم. این کل تابع منه. شما می تونید برای حل مشکلی که...
۱۷:۳۰:۳۱ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام در تکمیل سوالی که خدمت شما عرض شد: ببینید ما دو تا فیلد فایل داریم توی اولی عکس اپ میشه و توی...
۱۶:۲۶:۲۶ ۱۳۹۹/۰۲/۱۶
form ماردین
در:
سلام من میخواستم ببینم چکار کنم که اولین query رو بدون حذف بقیه query ها حذف کنم
۱۵:۵۲:۵۴ ۱۳۹۹/۰۲/۱۶
form میثم
در:
سلام یه سوال خدمت شما داشتم. من با جاوا اسکریپت میخوام بخش فایل توی فرمم رو چک کنم. توی فرم 2 تا فیلد...
۱۱:۴۷:۵۲ ۱۳۹۹/۰۲/۱۶
form amir mtf
در:
سلام ببخشید من میخواستم در تگ این‌پوت برخی از کلمات و علامت ها رو حذف کنم. یک درخواست دیگر هم دارم اگه میشه کد...
۱۲:۳۷:۰۵ ۱۳۹۹/۰۲/۱۵
form کیوان
در:
سلام ممنون از سایت خوبتون، من یه فرم دارم که اطلاعاتش رو از دیتابیس میگیره، چطور میتونم با نوشتن حلقه بعد از چاپ سه...
۱۸:۲۲:۲۴ ۱۳۹۹/۰۲/۱۳
form mohammad
در:
آموزشتون خیلی فهما و دقیق بود ممنون
۲۱:۵۵:۳۸ ۱۳۹۹/۰۲/۱۲
form محمودی
در:
سلام چطوری میتونم برای سایت ثبت نام کدبورسی و ثبت نام ارز دیجیتال بک لینک بگیرم
۱۵:۲۶:۰۷ ۱۳۹۹/۰۲/۱۲
در انتظار بررسی: ۰