PDA

View Full Version : سوال: اضافه کردن محدودیت برای آپلود فایل



soroush.r70
دوشنبه 01 خرداد 1391, 11:21 صبح
من یه کد آپلود فایل دارم به صورت زیر م یخوام براش محدودیت بزارم که حداکثر حجم فایل 3MB و فایل های مجاز برای آپلود zip , rar , pdf , doc باشه این محدودیت ها رو در کد زیر باید کجای کد زیر قرار بدیم . و کداش چیه ممنون می شم درستش کنین

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


if($_POST['s3'])
{
$tmp=$_FILES['file']['tmp_name'];
$name=$_FILES['file']['name'];
copy($tmp,"upload/".$name);

$fulname=addslashes(mysql_real_escape_string($_POS T['fulname']));
$reshte=addslashes(mysql_real_escape_string($_POST['reshte']));
$email=addslashes(mysql_real_escape_string($_POST['email']));
$title=addslashes(mysql_real_escape_string($_POST['title']));
$text=addslashes(mysql_real_escape_string($_POST['text']));
//pic
if(!empty($fulname))
{
if (!preg_match('/^[a-z0-9_\-+\.]+@([a-z0-9\-+]+\.)+[a-z]{2,5}$/i', $email))
{
echo'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script >alert("ایمیل مورد نظر صحیح نمی باشد.");</script>
<meta http-equiv="refresh" content="1;url='.$_SERVER['HTTP_REFERER'].'" />';
die();
}
else
{
$ip = $_SERVER['REMOTE_ADDR'];
$pdate = get_jalali2();
$res=mysql_query("INSERT INTO `table1`
(`id`,`fulname`,`reshte`,`email`,`title`,`text`,`p ic`,`ip`,`pdate`,`read`)
values
(NULL , '$fulname' , '$reshte' , '$email' , '$title' , '$text' ,'$name' , '$ip' , '$pdate' ,'0');");
echo'
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script> alert("مقاله مورد نظر ارسال شد و پس از بررسی در سایت قرار می گیرد.");</script>
<meta http-equiv="refresh" content="1;url='.$_SERVER['HTTP_REFERER'].'" />
';
die();
}
}
}

فرم من


<form action="'; echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES); echo'" method="post" enctype="multipart/form-data" name="form2" id="form2" onSubmit="return tests()">
<table width="450" height="448" border="0" align="center" class="tablesendpaper">
<tr>
<th width="149" scope="col">نام و نام خانوادگی :<span style="padding-right:5px; color:#f00;">*</span></th>
<th width="303" height="53" scope="col">
<label for="textfield"></label>
<input name="fulname" type="text" id="fulname" size="35" class="textsd">
</th>
</tr>
<tr>
<td>رشته تحصیلی :<span style="padding-right:5px; color:#f00;">*</span></td>
<th height="44" scope="row"><label for="textfield2"></label>
<input name="reshte" type="text" id="reshte" size="35" class="textsd"></th>
</tr>
<tr>
<td>پست الکترونیک :</td>
<th height="46" scope="row"><label for="textfield3"></label>
<input name="email" type="text" id="email" size="35" dir="ltr" class="textsd"></th>
</tr>
<tr>
<td>عنوان مقاله :<span style="padding-right:5px; color:#f00;">*</span></td>
<th height="47" scope="row"><label for="textfield4"></label>
<input name="title" type="text" id="title" size="35" class="textsd"></th>
</tr>
<tr>
<td>توضیحات :</td>
<th height="108" scope="row"><textarea name="text" id="text" cols="30" rows="5" class="textsd"></textarea></th>
</tr>
<tr>
<td>ارسال مقاله :</td>
<th height="72" scope="row"><label for="textarea"></label>
<div class="uploader green">
<input type="text" class="filename" readonly="readonly" name="file"/>
<input type="button" name="file" class="buttons" value="انتخاب فایل..."/>
<input type="file" size="30" name="file"/>
</div>
</th>
</tr>
<tr>
<td height="60" colspan="2"><strong>
<input type="submit" name="s3" class="button" value="ارسال مقاله" style="margin-left:80px;" id="s3">
</strong></td>
</tr>
</table>
</form>

Sajjad.Aghapour
دوشنبه 01 خرداد 1391, 11:30 صبح
با استفاده از
$_FILES['file']['type'] فرمت های ورودی رو فیلتر کنید. میتونید از
mime_content_type هم استفاده کنید. برای محدودیت Size هم از
$_FILES['file']['size'] میتونید استفاده کنید. خیلی ساده هستش. جستجو هم کنید میتونید به جوابتون برسید

soroush.r70
دوشنبه 01 خرداد 1391, 12:37 عصر
تو قسمت از کدی که من در بالا گذاشتم باید قرار بدم به چه صورت کدشو نمی دونم چیه

MMSHFE
دوشنبه 01 خرداد 1391, 14:51 عصر
این از فرم (به تگ hidden دقت کنید که 3 مگابایت محدودیت رو بصورت بایت مشخص میکنه) :


<form action="" enctype="multipart/form-data" id="form2" method="post" name="form2" onSubmit="return tests()">
<table width="450" height="448" border="0" align="center" class="tablesendpaper">
<tr>
<th width="149" scope="col">نام و نام خانوادگی :<span style="padding-right:5px; color:#f00;">*</span></th>
<th width="303" height="53" scope="col"><input name="fulname" type="text" id="fulname" size="35" class="textsd"/></th>
</tr>
<tr>
<td>رشته تحصیلی :<span style="padding-right:5px; color:#f00;">*</span></td>
<th height="44" scope="row"><input name="reshte" type="text" id="reshte" size="35" class="textsd"/></th>
</tr>
<tr>
<td>پست الکترونیک :</td>
<th height="46" scope="row"><input name="email" type="text" id="email" size="35" dir="ltr" class="textsd"/></th>
</tr>
<tr>
<td>عنوان مقاله :<span style="padding-right:5px; color:#f00;">*</span></td>
<th height="47" scope="row"><input name="title" type="text" id="title" size="35" class="textsd"/></th>
</tr>
<tr>
<td>توضیحات :</td>
<th height="108" scope="row"><textarea name="text" id="text" cols="30" rows="5" class="textsd"/></textarea></th>
</tr>
<tr>
<td>ارسال مقاله :</td>
<th height="72" scope="row">
<div class="uploader green">
<input name="MAX_FILE_SIZE" type="hidden" value="3145728"/>
<input type="text" class="filename" readonly="readonly" name="file"/>
<input type="button" name="file" class="buttons" value="انتخاب فایل..."/>
<input type="file" size="30" name="file"/>
</div>
</th>
</tr>
<tr>
<td height="60" colspan="2"><strong><input type="submit" name="s3" class="button" value="ارسال مقاله" style="margin-left:80px;" id="s3"></strong></td>
</tr>
</table>
</form>

این هم از صفحه پردازش فرم؛ به شرطهای مربوط به size و type دقت کنید (اعتبارسنجی اندازه و نوع فایل در سمت سرور ضروری هست) :


<?php
if(isset($_POST['s3'], $_POST['fulname'], $_POST['reshte'], $_POST['email'], $_POST['title'], $_POST['text'])) {
$tmp = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
$size = $_FILES['file']['size'];
$type = $_FILES['file']['type'];
$types = array('application/pdf', 'application/msword', 'application/x-rar-compressed', 'application/zip');
if(in_array($type, $types) && $size <= 3145728) {
move_uploaded_file($tmp, 'upload/'.$name);
}
$fulname = addslashes(mysql_real_escape_string($_POST['fulname']));
$reshte = addslashes(mysql_real_escape_string($_POST['reshte']));
$email = addslashes(mysql_real_escape_string($_POST['email']));
$title = addslashes(mysql_real_escape_string($_POST['title']));
$text = addslashes(mysql_real_escape_string($_POST['text']));
//pic
if(!empty($fulname)) {
if (!preg_match('/^[a-z0-9_\-+\.]+@([a-z0-9\-+]+\.)+[a-z]{2,5}$/i', $email)) {
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("ایمیل مورد نظر صحیح نمی باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
$pdate = get_jalali2();
$res = mysql_query("
INSERT INTO `table1`
(`fulname`,`reshte`,`email`,`title`,`text`,`pic`,` ip`,`pdate`,`read`)
VALUES
('{$fulname}','{$reshte}','{$email}','{$title}','{ $text}','{$name}','{$ip}','{$pdate}','0');
");
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("ایمیل مورد نظر صحیح نمی باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
}
}
?>

موفق باشید.

soroush.r70
سه شنبه 02 خرداد 1391, 11:30 صبح
خیلی ممنون از شما که خیلی سریع و به شیوه ی صحیح رسیدگی می کنید.

یک سوال جناب شهرکی این چیزی که در بالا گفتین احتیاج نداره که پیغامی در صورت اینکه فایل ارسالی مورد صحیح نبود نمایش بده چون من این تست کردم فقط پیغام ایمیل مورد صحیح نمی باشد صادر می شه.

ممنون می شم این مشکل هم برطرف کنید

MMSHFE
سه شنبه 02 خرداد 1391, 12:05 عصر
این شرط:


if(in_array($type, $types) && $size <= 3145728) {
move_uploaded_file($tmp, 'upload/'.$name);
}

رو به این صورت تغییر بدین:


if(in_array($type, $types) && $size <= 3145728) {
move_uploaded_file($tmp, 'upload/'.$name);
}
else {
echo '<p>Error in image format or size</p>'.PHP_EOL;
}

soroush.r70
جمعه 05 خرداد 1391, 12:41 عصر
نه آقا متاسفانه جواب نداد کد کامل این شد.


if(isset($_POST['s3'], $_POST['fulname'], $_POST['reshte'], $_POST['email'], $_POST['title'], $_POST['text'])) {
$tmp = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
$size = $_FILES['file']['size'];
$type = $_FILES['file']['type'];
$types = array('pdf','doc','rar','zip','jpg','gif','png','b mp');
if(in_array($type, $types) && $size <= 3145728) {
move_uploaded_file($tmp, 'upload/'.$name);
}
else
{
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("اندازه یا نوع فایل انتخاب شده غیرمجاز می باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
$fulname = addslashes(mysql_real_escape_string($_POST['fulname']));
$reshte = addslashes(mysql_real_escape_string($_POST['reshte']));
$email = addslashes(mysql_real_escape_string($_POST['email']));
$title = addslashes(mysql_real_escape_string($_POST['title']));
$text = addslashes(mysql_real_escape_string($_POST['text']));
//pic
if(!empty($fulname)) {
if (!preg_match('/^[a-z0-9_\-+\.]+@([a-z0-9\-+]+\.)+[a-z]{2,5}$/i', $email)) {
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("ایمیل مورد نظر صحیح نمی باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
$pdate = get_jalali2();
$res = mysql_query("
INSERT INTO `table1`
(`fulname`,`reshte`,`email`,`title`,`text`,`pic`,` ip`,`pdate`,`read`)
VALUES
('{$fulname}','{$reshte}','{$email}','{$title}','{ $text}','{$name}','{$ip}','{$pdate}','0');
");
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("فایل مورد نظر با موفقیت ارسال شد و پس از بررسی در سایت قرار می گیرد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
}
}

soroush.r70
جمعه 05 خرداد 1391, 12:43 عصر
نه آقا متاسفانه جواب نداد کد کامل این شد.


if(isset($_POST['s3'], $_POST['fulname'], $_POST['reshte'], $_POST['email'], $_POST['title'], $_POST['text'])) {
$tmp = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
$size = $_FILES['file']['size'];
$type = $_FILES['file']['type'];
$types = array('pdf','doc','rar','zip','jpg','gif','png','b mp');
if(in_array($type, $types) && $size <= 3145728) {
move_uploaded_file($tmp, 'upload/'.$name);
}
else
{
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("اندازه یا نوع فایل انتخاب شده غیرمجاز می باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
$fulname = addslashes(mysql_real_escape_string($_POST['fulname']));
$reshte = addslashes(mysql_real_escape_string($_POST['reshte']));
$email = addslashes(mysql_real_escape_string($_POST['email']));
$title = addslashes(mysql_real_escape_string($_POST['title']));
$text = addslashes(mysql_real_escape_string($_POST['text']));
//pic
if(!empty($fulname)) {
if (!preg_match('/^[a-z0-9_\-+\.]+@([a-z0-9\-+]+\.)+[a-z]{2,5}$/i', $email)) {
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("ایمیل مورد نظر صحیح نمی باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
$pdate = get_jalali2();
$res = mysql_query("
INSERT INTO `table1`
(`fulname`,`reshte`,`email`,`title`,`text`,`pic`,` ip`,`pdate`,`read`)
VALUES
('{$fulname}','{$reshte}','{$email}','{$title}','{ $text}','{$name}','{$ip}','{$pdate}','0');
");
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("فایل مورد نظر با موفقیت ارسال شد و پس از بررسی در سایت قرار می گیرد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
}
}

eshpilen
جمعه 05 خرداد 1391, 16:30 عصر
addslashes(mysql_real_escape_string($_POST['fulname']));
این چیه دیگه :متعجب:
mysql_real_escape_string و addslashes هردو یک عملیات انجام میدن.
الان شما داری دوبار Escape میکنی.
اونوقت به مشکلی نخوردی با این کد؟
یه تست بکن توی ورودیها اگر کاراکترهایی مثل \ یا ' باشه ببین چی میشه.

soroush.r70
جمعه 05 خرداد 1391, 19:49 عصر
مشکلی پیش نیومد شما می تونی بگی کد بالا چطوری حل می شه تا جواب بده

eshpilen
جمعه 05 خرداد 1391, 19:59 عصر
نه میگم در دیتابیس با بک اسلش های دوبله درج میشه. در نتیجه موقعی هم که میخونی احتمالا بک اسلش های اضافه داره.
یه بار دیگه چک کن این رو که گفتم.
تعجبم از آقای شهرکی که چنین کدی گذاشته. شاید از جایی برداشته و حواسش نبوده. خودشون بیان توضیح بدن لطفا.

MMSHFE
شنبه 06 خرداد 1391, 12:17 عصر
تعجبم از آقای شهرکی که چنین کدی گذاشته. شاید از جایی برداشته و حواسش نبوده. خودشون بیان توضیح بدن لطفا.
آقا من بی تقصیرم. این قسمت از کد رو من تغییر ندادم. فقط قسمت خطای مربوط به آپلود رو اصلاح کردم. من خودم موقعی که میخوام توی دیتابیس ذخیره کنم فقط از mysql_real_escape_string (با کمک گرفتن از stripslashes و get_magic_quotes_gpc برای جلوگیری از ترکیبات عددی) استفاده میکنم و موقع نمایش توی صفحه هم فقط htmlentities رو بکار میبرم.
این نمونه تابعی هست که من برای Escapeکردن اطلاعات موقع درج توی دیتابیس استفاده میکنم:


function sql_escape($value) {
mysql_connect('localhost', 'root', '');
mysql_set_charset('utf8');
if(get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
$value = '\''.mysql_real_escape_string(trim($value, '\'')).'\'';
return $value;
}

اتفاقاً من معتقدم این Escapeکردنهای اضافه ناشی از عدم اطلاعات کافی از کارکترهای مخرب هست تا جایی که خیلی از موارد دیدم با سختگیری بیش از حد در Escapeکردن، خیلی از کارکترهایی که میتونن مخرب هم نباشن از رشته ها حذف میشن. مثلاً وقتی میخوایم توی دیتابیس ذخیره کنیم، کارکترهای <> خطرناک نیستن چون صرفاً ازنظر HTML معنا دارن نه MySQL و درواقع با حذف اینها از عبارت ذخیره شده در دیتابیس، سختگیری بیش از حد انجام میدیم که خیلی جاها سرعت میاد پایین و حتی در برخی موارد نارضایتی کاربران رو هم در پی خواهد داشت.
موفق باشید.

soroush.r70
شنبه 06 خرداد 1391, 14:38 عصر
خوب این حله ولی اون کد کامل آخری که گذاشتین جواب نمی ده مشکل داره خودتون تست کردین

کد کامل اینه ولی جواب نمی ده اگه می شه یه بررسی کنید تشکر


if(isset($_POST['s3'], $_POST['fulname'], $_POST['reshte'], $_POST['email'], $_POST['title'], $_POST['text'])) {
$tmp = $_FILES['file']['tmp_name'];
$name = $_FILES['file']['name'];
$size = $_FILES['file']['size'];
$type = $_FILES['file']['type'];
$types = array('pdf','doc','rar','zip','jpg','gif','png','b mp');
if(in_array($type, $types) && $size <= 3145728) {
move_uploaded_file($tmp, 'upload/'.$name);
}
else
{
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("اندازه یا نوع فایل انتخاب شده غیرمجاز می باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
$fulname = addslashes(mysql_real_escape_string($_POST['fulname']));
$reshte = addslashes(mysql_real_escape_string($_POST['reshte']));
$email = addslashes(mysql_real_escape_string($_POST['email']));
$title = addslashes(mysql_real_escape_string($_POST['title']));
$text = addslashes(mysql_real_escape_string($_POST['text']));
//pic
if(!empty($fulname)) {
if (!preg_match('/^[a-z0-9_\-+\.]+@([a-z0-9\-+]+\.)+[a-z]{2,5}$/i', $email)) {
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("ایمیل مورد نظر صحیح نمی باشد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
else {
$ip = $_SERVER['REMOTE_ADDR'];
$pdate = get_jalali2();
$res = mysql_query("
INSERT INTO `table1`
(`fulname`,`reshte`,`email`,`title`,`text`,`pic`,` ip`,`pdate`,`read`)
VALUES
('{$fulname}','{$reshte}','{$email}','{$title}','{ $text}','{$name}','{$ip}','{$pdate}','0');
");
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'.PHP_EOL;
echo '<script type="text/javascript">alert("فایل مورد نظر با موفقیت ارسال شد و پس از بررسی در سایت قرار می گیرد.");</script>'.PHP_EOL;
echo '<meta http-equiv="Refresh" content="1; url='.$_SERVER['HTTP_REFERER'].'"/>'.PHP_EOL;
exit();
}
}
}

MMSHFE
شنبه 06 خرداد 1391, 19:06 عصر
چه خطایی دریافت میکنید؟

soroush.r70
شنبه 06 خرداد 1391, 22:14 عصر
خطایی نیست اسکریپت عمل نمی کنه فایل اگه درست باشه هم پیغام می ده و آپلود نمی شه

MMSHFE
شنبه 06 خرداد 1391, 22:25 عصر
قسمت دوم شرط (size <= 3145728) رو حذف کنید ببینید درست میشه یا نه. اگه درست شد، این خط رو قبل از شرط اضافه کنید:

settype($size, 'integer');
تا جایی که بررسی کردم، نسخه جدید PHP یکم با این اعداد مشکل داره!

soroush.r70
سه شنبه 09 خرداد 1391, 09:58 صبح
متاسفانه باز هم حل نشد چاره کار چیه جناب شهرکی

soroush.r70
چهارشنبه 10 خرداد 1391, 19:48 عصر
حل شدنی نیست...؟

MMSHFE
چهارشنبه 10 خرداد 1391, 20:04 عصر
میشه کد فرم آپلود و صفحه مقصد رو ضمیمه کنید تا روش کار کنم؟ ضمناً هیچ موقع تسلیم نشین (بجز درمقابل خدا). فقط غیرممکنه که غیرممکنه!

soroush.r70
پنج شنبه 11 خرداد 1391, 16:51 عصر
خدمت شما جناب شهرکی

MMSHFE
پنج شنبه 11 خرداد 1391, 19:41 عصر
براتون فایل رو اصلاح کردم. البته برای اینکه بتونم به راحتی کار کنم، مجبور شدم یکسری تغییرات توی کد بدم که اصلی ترینش فایل config.php هست بهمراه یکسری اصلاحات جزئی که شامل فایلهایی از کد شماست که من نداشتم (عکسها و...) و درنتیجه اون بخشها رو بصورت کامنت در آوردم که کافیه از حالت کامنت خارجش کنید. بعلاوه قبل از شرط سشن هم یک ! گذاشتم تا بدون سشن بتونم کار کنم که اون رو هم باید حذف کنید. نکته اصلی استفاده از پسوند فایل (سه کارکتر آخر) برای ذخیره سازی و مقایسه با آرایه پسوندها هست (بجای اندیس type که نوع MIME رو اعلام میکنه).
موفق باشید.