شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

آموزش نحوه آپلود فایل با 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 و توابع مربوط به فایل توصیه نمی شود.
دسته بندی: آموزش کاربردی » Ajax
related مطالب بیشتر:
نمایش زنده آمار و اطلاعات با ای جکس (Ajax)
نمایش نتایج پایگاه داده MySQL با PHP و ای جکس (Ajax)
اعتبارسنجی همزمان فرم با ای جکس (Ajax) و PHP
ساخت قابلیت امتیازدهی با PHP و Ajax
ارسال اطلاعات فرم با ای جکس (Ajax) و نمایش پیام در حال پردازش
دیدگاه
more ۱۴۷ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
پریسا
۲۳:۲۸ ۱۳۹۳/۰۸/۰۲
با سلام و تشکر فراوان از سایت خیلی خوبتون
میخواستم بدونم چه جوری میشه تاریخ آپلود رزومه توسط سیستم اساین شه؟ بازم تشکر
منظورتان از "توسط سیستم اساین شه" مشخص نیست! لطفا بیشتر توضیح دهید.
سهیل
۱۶:۳۴ ۱۳۹۳/۰۷/۲۸
بهترینید ! همیشه !
علی
۱۸:۴۱ ۱۳۹۳/۰۷/۱۸
سلام
چند نظر بالاتر در مورد اپلود فایل های سنگین گفتم خدمتتون
پیدا کردم یکیش رو خیلی هم خوبه
فقط یه جاییش منو گیج کرده
وقتی عکس اپلود میشه لینک عکس بیس 64 میشه
به این شکل
data:image/png;base64,iVBORw0KGgoAAAANSUhEU
لینک خیلی طولانی تر از ایناست
بعد اپلود من هر چقدر می گردم اون عکسی رو که اپلود کردم نمیتونم پیدا کنم
پس کجا آپلود میشه؟
اینم لینک دانلودش
https://github.com/mailru/FileAPI
ظاهرا تو یه سرور دیگه اپلود میشه
چطوری میتونم تغییرش بدم که تو هاست خودم اپلود شه
یه نگاه بندازید به توضیحاتش شاید شما متوجه بشید
متاسفانه امکان نصب و تست این برنامه به دلیل کمبود فرصت میسر نیست، در یک نگاه اجمالی ظاهرا از فلش در این پروژه استفاده شده و این احتمال وجود دارد که لینک مورد نظر در درون سورس فلش تعریف شده باشد، در نمونه اسکریپت ها و راهنمای آن آدرس چند فایل PHP نیز دیده می شود!
امین
۲۱:۳۸ ۱۳۹۳/۰۷/۱۴
با سلام خدمت شما و با تشکر از وقتی که میذارید. من یه سایت با php طراحی کردم . وقتی میخوام فایلی اپلود کنم با اپاچی مشکلی نیست اما وقتی رو سرور تست میکنم هیچ عکس العملی نشون نمیده و فقط یه صفحه سفید میاد. جستجو کردم دیدم میگن شاید پوشه مورد روی سرور نظر قابل نوشتن نباشه. تست کردم دیدم نوشتنی هست. حجم فایل هم کمه زیر 1 مگ هست. نمیدونم کجای کار گیره؟ به نظرتون مشکل از سرور هست؟ نمونه کامل کد را در زیر میارم. لطفا نظرتون رو بنویسید.
<?php  
if (isset($_POST['UploadedFile'])) {
@$file_name = $_FILES['UploadedFile']['name'];
$target_path = "uploads/".$file_name;
if(@move_uploaded_file($_FILES['UploadedFile']['tmp_name'], $target_path))
{ echo "yes";} else {echo "no";} }
?>
ضمنا ببینید مسیر رو درست دادم یا نه؟ پوشه مورد نظر برای اپلود uploads نام داره و در پوشه ریشه سرور (root) قرار داره.
طبق کدهای ارسالی در شرط if از متد POST استفاده کرده اید، این متد برای فیلد فایل باید
$_FILES['UploadedFile']['name'] != '' 
باشد یا اینکه از POST برای یک فیلد متنی استفاده کنید، به فرض یک فیلد مخفی از نوع hidden!
برای خطایابی می توانید بعد از دستور if اول یک else با خروجی فرضی داشته باشید.
نکته: علامت های @ را برای نمایش خطاها حذف کنید، نام فیلدها را به لحاظ خطای تایپی چک کنید، همچنین حداکثر حجم مجاز برای آپلود فایل را از طریق تنظمیات PHP یا پشتیبانی هاست خود جویا شوید.
علی
۱۱:۲۰ ۱۳۹۳/۰۷/۱۴
سلام خسته نباشید
آقا من خیلی گشتم واقعا چیزی پیدا نکردم که به درد بخور باشه
سایت آپارات یا سایت های مشابه رو دیدی حتما
وقتی ویدئو آپلود میکنی به صورت درصد مانند بهت نشون میده
البته باید با دیتابیس هم ارتباط داشته باشه چون هم قرار فایل رو یه یه پوشه خاص انتقال بده و همینطور ادرس رو هم به دیتابیس انتقال بده
اسکریپتی یه منبع چیزی سراغ ندارید
خداوکیلی گیرم
برای نمایش حالت بارگذاری (loading) آپلود فایل عملا چاره ای جزء استفاده از پلاگین های مبتنی بر جی کئوری نیست، در وب عبارت "jQuery file upload loading" را جستجو کنید، نمونه های آماده زیادی وجود دارد.
شهاب
۱۵:۵۶ ۱۳۹۳/۰۶/۱۸
با سلام
من از آپلود فایل به صورت multiple استفاده میکنم. میخوام حجم کل فایل ها رو قبل از آپلود محاسبه کنم اگر بیشتر از یک مقدار مشخص باشه ارور بده.
می توانید در یک حلقه foreach بین فایل های ارسال شده دور زده و مجموع حجم آنها را در متغیری ریخته و سپس در بیرون از حلقه کل حجم نهایی متغیر را برای محاسبه استفاده کنید.
۱۲:۵۰ ۱۳۹۳/۰۶/۰۹
با سلام و تشکر
می خواستم بدونم که چگونه میشود در زمان آپلود فایل درصد آپلود شدن آن هم نمایش داده شود؟
برای نمایش درصد آپلود باید از افزونه های عمدتا مبتنی بر جی کئوری استفاده کنید که در وب منبع (به انگلیسی) به همراه آموزش آن وجود دارد.
۱۸:۵۱ ۱۳۹۳/۰۶/۰۶
باسلام و تشکر
چگونه می شود چند فایل را بصورت همزمان آپلود کرد؟
باید از علامت [] در انتهای نام input استفاده کرده (multiple) و در سرور به صورت آرایه اطلاعات را دریافت و پردازش کنید.
Ali Zeus
۱۲:۲۱ ۱۳۹۳/۰۵/۲۰
با سلام و ممنون از کمکتون
روش اول شما بخوبی کار کرد اما روش دوم ارور میده و من با نگاهی به فایل
http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php
روش دوم رو به این صورت تغیر دادم که نتیجه داد
<?php
$filename=$_FILES["file_up"]["tmp_name"];
$filetype=$_FILES["file_up"]["type"];
if($filetype == "image/jpeg") {$image = imagecreatefromjpeg($filename);}
else if($filetype == "image/gif") {$image = imagecreatefromgif($filename);}
else if($filetype == "image/png") {$image = imagecreatefrompng($filename);}
$w = imagesx($image);
$h = imagesy($image);
echo 'w:'.$w.'<br />h:'.$h;
?>
ممنون از به اشتراک گذاری.
Ali Zeus
۱۸:۰۸ ۱۳۹۳/۰۵/۱۸
سلام و خسته نباشید
ببخشید، چطور میشه اندازه عکس رو به پیکسل به دست اورد و اپلود رو محدود کرد که مثلا تصاویر بزرگتر از 100px اپلود نشن؟
توسط یکی از روش های زیر می توانید ارتفاع و عرض تصویر را به دست آورده و برای آن دستور شرطی مناسب بنویسید:
<?php
$imagesize = getimagesize($image_string);
echo 'Width: ' . $imagesize[0] . ' pixels<br />';
echo 'Height: ' . $imagesize[1] . 'pixels';
?>

<?php
$image = imagecreatefromstring($img_str);
$w = imagesx($image);
$h = imagesy($image);
?>
نکته: مقدار ورودی برای توابع بالا در هنگام آپلود فایل می تواند قسمت زیر باشد:
$_FILES['file']['tmp_name'] 
Ali Zeus
۰۱:۱۲ ۱۳۹۳/۰۵/۱۰
با سلام
بسیار ممنون از کمکتون
بله من از عبارت php در ابتدای کدها استفاده کردم.... ولی این قسمت از کدها رو از وسط کدهایی که نوشتم کپی کردم اینجا و یادم رفت اینجا اون php رو بنویسم
بازم ممنون
Ali Zeus
۱۵:۱۵ ۱۳۹۳/۰۵/۰۷
با سلام
بسیار ممنون از راهنماییتون
طبق راهنمایی که کردین، من یه تیبل در دیتابیس ایجاد کردم و نام عکس و تاریخ ارسال رو با
date('U')
ذخیره میکنم یه کد پی اچ پی هم نوشتم و به کد قبلی اضافه کردم که هر بار هر کاربری بخواد عکس ارسال کنه اون هم اجرا میشه و تصاویری رو که یک ساعت از ارسالشون میگذره رو سلکت میکنه و اول از پوشه و بعد از دیتابیس پاک میکنه
تست کردم کار میکنه ولی اگه میشه شما هم یه نگاهی بندازین تا اگه مشکلی بود درستش کنم
<?
$Select_old_img_and_Del=$this->dbObj->sqlGet("SELECT img_name FROM img_sharing WHERE sharing_date < '".date('U',time()-3600)."' ");
if (is_array($Select_old_img_and_Del)){
for ($a=0; $a < count($Select_old_img_and_Del); $a++){
@unlink('./user_img_sharing/'.$Select_old_img_and_Del[$a][0]);
if (file_exists('./user_img_sharing/'.$Select_old_img_and_Del[$a][0])){}
else{$this->dbObj->sqlGet("DELETE FROM img_sharing where img_name = '".$Select_old_img_and_Del[$a][0]."'");
}
}
}
?>
بسیار ممنون
طبق بررسی اجمالی روش شما مشکلی ندارد، البته بهتر است شروع تگ PHP با عبارت php نیز همراه باشد.
Ali Zeus
۰۲:۴۶ ۱۳۹۳/۰۵/۰۶
با سلام مجدد و ممنون از پاسختون
چطور میشه تصویر رو به صورت موقت در هاست اپلود کرد که پس از مدتی (بعد از نمایش در سیستم مخاطب) حذف بشه؟
من در چترومم از فایل SimpleImage.php استفاده میکنم
http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php
که با فانکشن load تصویر رو میگیرم و با فانکشن resize اندازه پیکسل تصویر رو کاهش میدم و با save تصویر رو در هاست ذخیره میکنم و لینک تصویر رو در تگ img برای مخاطب به نمایش در میارم
فقط برای حذف تصاویر بعد از نمایش ممنون میشم راهنمایی کنید
بدین منظور محدودیتی از نظر روش وجود ندارد، مهم رسیدن به هدف یعنی حذف فایل های موقت پس از گذشت مدت زمان معین است، راه حل معمول ذخیره اطلاعات فایل ها در دیتابیس (شامل تاریخ و زمان آپلود) و ذخیره فیزیکی فایل در دایرکتوری سرور است، سپس به فواصل زمانی معین، به طور مثال با هر بار فعالیت کاربران یا با Cron Job در cPanel می توان یک کد PHP را اجرا کرد که مسئولیتش بررسی تاریخ فعلی و حذف فایل هایی باشد که به فرض یک روز قبل آپلود شده اند، البته توسعه این سیستم، هوشمند سازی و سفارشی سازی آن نیاز به صرف وقت و آزمایش و خطا دارد که قاعدتا در این قسمت قابل طرح نیست.
Ali Zeus
۱۸:۰۱ ۱۳۹۳/۰۵/۰۵
با سلام و تشکر از اطلاعات واقعا مفیدی که ارائه میدین
میخواستم ببینم راهی هست که فایل عکس را بدون ذخیره شدن در هاست برای دیگران فرستاد یا به نمایش در اورد؟
برای مثال در چتروم امکانی ایجاد کرد که کاربران عکس مورد نظر خود را بدون اپلود شدن در هاست برای دوستان خود ارسال کنند
یعنی فایل عکس از یک سیستم مستقیما به سیستم دیگر فرستاده شود مانند فرستادن فایل با یاهو مسنجر
در یاهو چنین کاری صورت نمی گیرد، در واقع عکس های شما حداقل برای مدت کوتاهی در سرور یاهو قرار دارند!
این نوع انتقال صرفا تحت روش هایی مانند استفاده از برنامه های Peer-to-Peer یا پروتکل FTP امکانپذیر است.
محمد
۲۳:۴۵ ۱۳۹۳/۰۵/۰۲
سلام مجدد
در قسمت مدیریت سایتی که طراحی میکنم یه بخش اضافه کردن محصول هست ، به این صورت کار میکنه که هر محصول یه سری مشخصات داره که با تکست دریافت می کنم و بعد برای آپلود عکس محصول از این سیستم آپلود که شما زحمت کشیدید استفاده کردم منتها در این سیستم دو فرم استفاده کردم یکی برای آپلود عکس و دیگری برای اضافه کردن مشخصات محصول (فرمها تو در تو نیست) و ابتدا با اکشن شدن فرم آپلود عکس (در اینجا php-ajax-upload.php) ، عکس را آپلود و رکورد را در دیتابیس ایجاد کردم و نام عکس را فیلدش قرار دادم (تا اینجا بدون رفرش) (البته یک دکمه انصراف از آپلود هم قرار دادم که در صورت پشیمان شدن مدیر سایت از آپلود ، اطلاعات از دیتابیس پاک شده و عکس از هاست پاک شود) و سپس در صفحه اول با اکشن شدن فرم دوم اطلاعات داخل تکست ها را درون آخرین رکورد ثبت شده در جدول قرار دادم اول با این دستور آخرین رکورد را پیدا کردم
SELECT column FROM table ORDER BY IDField DESC LIMIT 1
سپس update کردم یه جورایی مثل پست کردن مطالب در شبکه های اجتماعی شد.
مشکلی که هست اینه که اگه مدیر سایت عکس رو آپلود کرد و پشیمان شد از آپلود! و یادش رفت روی دکمه انصراف از آپلود کلیک کنه یه رکورد در جدول بی جهت ثبت میشه ، البته در قسمت محصولات قابل مشاهده هست و میتونه پاک کنه ، مدیر سایت یک نفر هست و میشه توجیهش کرد که حواسش باشه و مدیرت کنه ولی من از این بابت یکم عذاب وجدان دارم ! و از عذاب وجدان هم که بگذریم اگه اینو بخوام در صفحات سایت استفاده کنم (مثلا یه سیستم ثبت نام که عکس داره) باید چی کار کنم؟ اونجا دیگه انصراف از آپ بی معنیه و اگه کاربر بعد از آپ ، کار با سایتو رها کنه و بره ، یک رکورد بی جهت در جدول درج میشه و یک عکس هم بی جهت در هاست!
و باز اینکه مثلا اگه چند نفر همزمان در سیستم ثبت نام ، ثبت نام کنن و ما بر اساس آخرین رکورد کار کنیم اطلاعات با عکس ها قاطی میشه و اشتباه در درج اطلاعات رخ میده من با اندک دانش طراحی ای که داشتم این سیستمو پیاده کردم لطفا راهنمایی کنید که کاملش کنم ، اگه لازم باشه کدها رو هم در اختیارتون میذارم
این نکته هم بگم که حتما میخوام بدین گونه باشه که سیستم آپ با سیستم اضافه کردن محصول جدا باشه تا ابتدا کاربر از آپ شدن عکس مطمئن بشه بعد محصول رو اضافه کنه یا در سیستم ثبت نام به مرحله بعد بره
در مورد دانش php و java هم هر چیز که لازم باشه تقریبا بلدم و یا اگه بلد نباشم میتونم خیلی زود یاد بگیرم
ممنون
برای طراحی برنامه های کاربردی و سیستم های تحت وب صرف آشنایی با یک زبان برنامه نویسی کفایت نمی کند، بلکه داشتن مهارت و تجربه تعریف ساختار برنامه در درجه اول اهمیت قرار می گیرد، در اینجا هم چیزی که در نگاه نخست به ذهن می رسد اینکه نباید برنامه به رفتار کاربر متکی باشد، بلکه باید حساب همه چیز از قبل شده باشد، به طور مثال برای هدف شما می توان یک جدول و دایرکتوری با اطلاعات موقت در نظر گرفت که صرفا برای مدت محدودی نتایج را در خود داشته باشند و در صورت تکمیل ثبت نام یا گذشت مدت زمان خاصی، توسط فراخوانی منظم دستوراتی، موارد تاریخ گذشته حذف گردند، البته این ایده نیاز به داشتن تسلط بالا در PHP دارد و خیلی ساده نیست، در واقع پروژه شما ساده نیست و قسمت به قسمت ممکن است شما را به چالش بکشد، لذا نمی توان توضیح کوتاهی برای حل مشکل ارائه کرد.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
6 × 8
20 × 20
=