PDA

View Full Version : سوال: مشکل در آپلود فایل در سایت



Ali0Boy
دوشنبه 29 اسفند 1390, 20:06 عصر
باسلام و خسته نباشید خدمت تمامی سروران گرامی
من یک کدی برای آپلود فایل از اینور و اونور نوشتم. یکسری خط هاش رو دقیق متوجه نمی شوم. می خواستم در مورد اونها اگه بشه یکم توضیح بدهید. فایل در ضمیمه است.
و این آپلودری که نوشتم یکسری فایل ها مثل pdf و ... رو نمی تواند آپلود کند، چرا؟ چگونه می توانم برای این آپلودر مشخص کنم که وقتی صفحه ی انتخاب فایل باز می شود فقط یکسری از فرمت ها رو نمایش بدهد؟ چطور می تواند برای شی آپلود فایل استایل تعریف کنم که شکل کلید و تکس باکس اون زیبا باشه و همچنین متن کلید اون رو هم پاک کنم؟ و همچنین اگر یک کد مناسب و خوب دارید برای آپلودر البته با توضیحات اینجا ارسال کنید ممنون می شوم.

مشکلات در یکسری خط ها:
در فایل Index:
خط 6 وظیفه ی enctype در اینجا فرم چیست؟
خط 7 این input مخفی که برای سایز هست چطور به سیستم اعلام وضعیت سایز فایل رو می کنه و value آن برحسب چه واحدی مقدار دهی می شود.

در فایل upmyweb:
در این فایل اگر بشود کل آن را توضیح دهید و این متغییر مخصوص با نام $_FILE کارش چیست؟
و همچنین من که چیزی به نام tmp_name و ... ارسال نکرده ام پس چطور این ها را می توانم استفاده کنم؟
اینطور که من دستگیرم شد یک فایل با پسوند tmp می سازد که محتویاتش همان محویات فایل است، چطور من که دستوری نداده ام و ...

ممنون می شوم از اساتید اگر مرا راهنمایی کنند. البته مدیران ببخشند :بوس: من چون برای یک پروژه شدیدا عجله داشتم نتوانستم زیاد جستجو کنم. و جستجو هایی هم که کردم چیزی که بتواند منو خوب آشنا کند پیدا نکردم.

MMSHFE
سه شنبه 01 فروردین 1391, 13:25 عصر
با سلام، کدتون رو یکم تغییر دادم. این کد فایل index.php هست:


<?php
$max_file_size = 200 * 1024; // 200 KB
?>
<!doctype html>
<html dir="rtl">
<head>
<title>My Uploader</title>
<meta charset="utf-8"/>
<style type="text/css">
* {
font-family: Tahoma;
font-size: 8pt;
}
</style>
</head>
<body>
<fieldset style="width: 280px;">
<legend>&nbsp;آپلود فایل&nbsp;</legend>
<?php
if(isset($_GET['r'])) {
echo '<script type="text/javascript">alert("';
switch($_GET['r']) {
case 1:
echo 'اندازه فایل بیش از '.$max_file_size.' بایت است';
break;
case 2:
echo 'اندازه فایل بیش از '.$max_file_size.' بایت است';
break;
case 3:
echo 'فقط بخشی از فایل آپلود شده است';
break;
case 4:
echo 'فایلی انتخاب نشده است';
break;
case 5:
echo 'خطای ناشناخته. مجدداً سعی کنید';
break;
case 6:
echo 'پوشه موقت برای آپلود در دسترس نیست. با پشتیبانی تماس بگیرید';
break;
case 7:
echo 'عدم امکان نوشتن در دیسک. با پشتیبانی تماس بگیرید';
break;
case 8:
echo 'یکی از افزونه ها جلوی آپلود فایل را گرفته است. با پشتیبانی تماس بگیرید';
break;
}
echo '");</script>'.PHP_EOL;
}
?>
<form action="upmyweb.php" enctype="multipart/form-data" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size; ?>"/>
آدرس فایل آپلود:&nbsp;<input name="fileupload" style="width: 200px;" type="file"/>
<br/><br/>
<input type="submit" value="آپلود کن"/>&nbsp;&nbsp;
<input type="reset" value="از نو"/>
</form>
</fieldset>
</body>
</html>

توی این فایل، ابتدا حداکثر اندازه مجاز برحسب بایت محاسبه میشه و توی متغیر max_file_size$ قرار میگیره. بعد یک فرم ساخته میشه برای آپلود فایل از اون استفاده میکنیم. خاصیت "enctype="multipart/form-data برای آپلود فایل ضروری هست و حتماً متد فرم هم باید post باشه (برای آپلود). enctype مربوطه اعلام میکنه که اطلاعات فرم در Partهای متوالی ارسال میشه چون حجم فایلها معمولاً بیشتر از اندازه پهنای باند هست و درواقع به صفحه مقصد میگه که با دریافت بسته اول شروع به پردازش نکنه و صبر کنه همه Partها برسه (بطور خلاصه، میگه که داده های فرم، چند Part داره نه یکی). بدون این خاصیت، امکان آپلود وجود نداره، حتی اگه از تگ input با خاصیت type برابر با file استفاده کنیم. تگ مخفی اندازه فایل هم درواقع حداکثر اندازه مجاز رو برحسب بایت مشخص میکنه. البته نباید خیلی به این عدد اطمینان کنید و در سمت سرور هم همونطور که در ادامه خواهید دید، باید سایز رو چک کنیم چون فرمهای HTML رو با یک کد ساده جاوا اسکریپت میشه تغییر بدیم یا اینکه فرد خودش یک فرم دیگه بسازه و با اون، فایلهای بزرگتر رو اجازه آپلود بده و target فرمش رو به صفحه مقصد سایت ما نسبت بده.
و این هم کد فایل upmyweb.php که پردازش اطلاعات رو برعهده داره:


<!doctype html>
<html dir="rtl">
<head>
<title>My Uploader</title>
<meta charset="utf-8"/>
<style type="text/css">
* {
font-family: Tahoma;
font-size: 8pt;
}
</style>
</head>
<body>
<?php
if(isset($_FILES['fileupload'])) {
$dir = './';
$file = &$_FILES['fileupload'];
echo '<pre>'.PHP_EOL;
echo '<b>'.PHP_EOL;
echo '<p>مسیر آپلود موقت : '.$file['tmp_name'].'</p>'.PHP_EOL;
echo '<p>نام : '.$file['name'].'</p>'.PHP_EOL;
echo '<p>نوع : '.$file['type'].'</p>'.PHP_EOL;
echo '<p>اندازه برحسب بایت : '.$file['size'].'</p>'.PHP_EOL;
echo '</b>'.PHP_EOL;
echo '</pre>'.PHP_EOL;
if($file['size'] <= (200 * 1024) && $file['error'] == 0) {
if(move_uploaded_file($file['tmp_name'], $dir.'/'.$file['name'])) {
echo '<p>فایل با موفقیت آپلود شد!</p>'.PHP_EOL;
echo '<p><a href="index.php">فایل جدید</a></p>'.PHP_EOL;
}
else {
header('location: index.php?r=7');
exit();
}
}
else {
header('location: index.php?r='.$file['error']);
exit();
}
}
else {
header('location: index.php');
exit();
}
?>
</body>
</html>

توی PHP موقع آپلود فایل، بطور خودکار فایلهای آپلودشده به پوشه موقتی با یک اسم موقت منتقل میشن تا اونها رو پردازش کنیم و با تابع move_uploaded_file سر جاهای مناسب قرار بدیم. آرایه FILES_$ هم که یک آرایه دوبعدی هست، بطور خودکار ایجاد میشه که اندیس اولش، اسم فایل آپلودشده (خاصیت name تگ input از نوع file توی فرم آپلود) هست و اندیس دوم یکی از مقادیر زیر هست:
tmp_name : اسم و مسیر فایل موقت روی سرور
name : اسم فایل اصلی که آپلود شده
size : اندازه فایل برحسب بایت
type : نوع MIME فایل مربوطه (مثلاً image/jpeg و...)
error : خطای احتمالی که در زمان آپلود ممکنه رخ داده باشه. این خطا میتونه یکی از مقادیر زیر باشه:
0 - خطایی رخ نداده
1 - اندازه فایل بیشتر از حداکثر سایز مجاز هست که توی فرم آپلود مشخص شده
2 - اندازه فایل بیشتر از حداکثر سایز مجاز هست که توی php.ini در قسمت max_upload_filesize مشخص شده
3 - Partهای فایل بطور کامل نرسیده
4 - کاربر فایلی رو برای آپلود انتخاب نکرده
5 - ناشناخته
6 - عدم دسترسی به پوشه موقت برای ذخیره فایل موقت
7 - عدم وجود Write Permission برای نوشتن در دیسک
8 - یکی از Pluginهای PHP جلوی آپلود رو گرفته. دقیقاً نمیشه فهمید کدوم یکی ولی با phpinfo میتونید فهرست افزونه های فعال رو ببینید و تشخیص بدین کدوم یکی با آپلود فایل تداخل داره
همونطور که میبینید، درصورت وجود خطا یا بیشتر بودن سایز فایل از حد مجاز، پیغام خطا به فایل index.php با روش get برگردونده میشه تا برحسب اون، هشدار مناسب به کاربر نشون داده بشه.
اگه سؤال خاصی بود در خدمتم.

MMSHFE
سه شنبه 01 فروردین 1391, 13:28 عصر
یک نکته هم دیدم بد نیست بگم و اون اینکه میشد توی خطای 2 با ('ini_get('upload_max_filesize حداکثر اندازه مجاز ازنظر PHP رو بدست بیاریم و نشون بدیم ولی چون همیشه این اندازه بیشتر از سایز مجاز فایلی هست که خودمون میگذاریم (تگ مخفی MAX_FILE_SIZE نمیتونه بزرگتر از اون باشه و اگه عدد بزرگتری بخواین، باید php.ini رو هم متناسب با اون ویرایش کنید) و ازطرفی بهتره اطلاعات پیکربندی PHP سایت رو حتی الأمکان به کاربر نشون ندیم، متن پیغام خطای 1 و 2 رو مثل هم گذاشتم. موفق باشید.

Ali0Boy
سه شنبه 01 فروردین 1391, 22:43 عصر
استاد گرامی آقای شهرکی خیلی ممنون از راهنمایی تون مشکلم حل شد. فقط یک سوال هنوز هست "اگه بخواهم برای قسمت دکمه و قسمت متن ابزار file استایل تعریف کنم که زیبا باشد چه کاری باید بکنم؟" کد یکسری از سایت ها را که بررسی می کردم می دیدم که یک text و یک دکمه جداگانه ایجاد کرده اند و یک file مخفی نیز ایجاد کرده اند. وقتی بر روی دکمه کلیک می شود در اصل فایل اجرا می شود و بعد مقدار دریافتی در text ای که خودشان طراحی کردند وارد می شود. می خواستم بدونم به چه صورت و اگه امکان داره یک کد به صورت عملی توضیح دهید."

باتشکر و سپاس

MMSHFE
چهارشنبه 02 فروردین 1391, 01:44 صبح
یک مثال با jQuery :


<script>
$("#text").change(function() {
$("#file").val($(this).val());
});
</script>
<input id="text" type="text"/>
<input id="file" name="file" type="file"/>

حقیقتش تست نکردم ولی باید کار کنه.

MMSHFE
چهارشنبه 02 فروردین 1391, 15:24 عصر
استاد گرامی آقای شهرکی خیلی ممنون از راهنمایی تون مشکلم حل شد.
با سلام، خوشحالم که مشکلتون برطرف شد ولی دکمه تشکر کاربرد قشنگتری داره :چشمک:

Ali0Boy
چهارشنبه 02 فروردین 1391, 23:16 عصر
باسلام خدمت دوستان و اساتید گرامی مخصوصا آقای شهرکی که یادم آوردند یه لینک تشکری هم در انجمن هست! :لبخند:
این فایل که می گزارم انشاءالله مشکل دیگر دوستانمان را در این ضمینه هم حل کنه. در این کار شما فقط می توانید فایل هایی با فرمت های gif jpg png bmp را فقط دانلود کنید.

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

http://s1.picofile.com/file/7334683331/qw.png

دانلود فایل اون هم که تو ضمینه هست. فقط تاکید می کنم لینک تشکر یادتون نره! :لبخند:
همه موفق باشید، خداحافظ.

Ali0Boy
چهارشنبه 02 فروردین 1391, 23:38 عصر
اساتید و دوستان هرکس می دونه چطور می شود متن داخل textarea را از حالت متنی به حالت html تبدیل کرد، ممنون می شوم در این تاپیک (http://barnamenevis.org/showthread.php?333295-%DA%86%D8%B7%D9%88%D8%B1-%D9%85%D8%AA%D9%86-%D8%AF%D8%A7%D8%AE%D9%84-textarea-%D8%B1%D8%A7-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-html-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%AF%D9%87%D9%85%D8%9F-%21%21%21-%D8%B6%D8%B1%D9%88%D8%B1%DB%8C-%D9%88-%D9%81%D9%88%D8%B1%DB%8C) راهنمایی کنید.