PDA

View Full Version : Post_max_size



vahidqara
پنج شنبه 29 آبان 1393, 18:34 عصر
سلام و درود به دوستان.
این post_max_size رو تو آپلود چطوری میشه کنترل و پیغام مناسب داد؟!!
یعنی کد خطا داره؟ مثل دیگر خطاها؟
راهی هست؟
مچکرم :لبخندساده:

abolfazl-z
پنج شنبه 29 آبان 1393, 22:59 عصر
سلام

من که منظور اصلی را متوجه نشدم.

نگاه کنید post_max_size به کل داده ها اشاره دارد یعنی اگر شما post_max_size را 20 مگ بگذارید کلا حجمی که به سرور یا اسکریپت میرسد همینقدر هست و این شامل مجموع فایل های آپلود و POST_$ می شود و در صورتی که مقدار از این بیشتر شود هر دو متغیر FILES_$ و POST_$ خالی می شوند.

حالا شما چی رو می خواهین کنترل کنید ؟ منظورتون را واضح تر یا با مثال بیان کنید.

vahidqara
جمعه 30 آبان 1393, 09:28 صبح
درود.. کاملا. ببینید حالا کاری به مجموعه ارسالی ها نداریم , صرفا قراره مثلا یه فایل ارسال شود که اگر از یه حجمی بالاتر شود با خطایی زیر مواجه میشویم
Warning: POST Content-Length of 173923988 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

که نمایش فرم رو کلا زشت و به هم می ریزه.!!!! سوال من اینه این خطا رو با کد نویسی چطوری میشه کنترل کرد که اگه مثلا از 20 مگ بیشتر بود خطای دلخوا رو چاپ کنه؟
چون مثل سایر خطاهای موجود کد خطا ندارد..!!! امیدوارم منظورمو رسونده باشم.:لبخندساده:

hamedarian2009
جمعه 30 آبان 1393, 09:44 صبح
فکر میکنم اگه به این آموزش نگاه کنی قسمت check filesize متوجه میشی باید چیکار کنی
http://codular.com/php-file-uploads

MMSHFE
جمعه 30 آبان 1393, 10:23 صبح
راحتترین کار اینه که post_max_size رو به حد کافی افزایش بدین و upload_max_filesize رو تنظیم کنید. اینطوری اگه تو اندیس error فایل مربوطه خطای شماره 1 وجود داشت یعنی از حد مجاز رد شده. مشروح کدهای خطای PHP درمورد آپلود فایل:
http://php.net/manual/en/features.file-upload.errors.php

abolfazl-z
جمعه 30 آبان 1393, 12:56 عصر
درود.. کاملا. ببینید حالا کاری به مجموعه ارسالی ها نداریم , صرفا قراره مثلا یه فایل ارسال شود که اگر از یه حجمی بالاتر شود با خطایی زیر مواجه میشویم
Warning: POST Content-Length of 173923988 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

که نمایش فرم رو کلا زشت و به هم می ریزه.!!!! سوال من اینه این خطا رو با کد نویسی چطوری میشه کنترل کرد که اگه مثلا از 20 مگ بیشتر بود خطای دلخوا رو چاپ کنه؟
چون مثل سایر خطاهای موجود کد خطا ندارد..!!! امیدوارم منظورمو رسونده باشم.:لبخندساده:


حالا روشن شد :لبخندساده:

در ادامه فرمایشات جناب آقای شهرکی

نگاه کنید این خطا زمانی رخ می دهد که مقدار upload_max_filezie بیشتر از post_max_size باشد. من این رو خودم به شخصه تست کردم و در کل بطور پیش فرض (اگه خودم دست نکرده باشم) در xampp این تنظیم درست نیست و مقدار upload_max_filesize از post_max_size بیشتر است و این خطا نیز در تست من هم رخ داد.

بهترین راه اش هم آن است که آقای شهرکی گفتند. (اگر دسترسی کامل به php.ini دارید)

اما همیشه ممکن هست این خطا رخ دهد چون در هر صورت بیش تر ارسال بشود خطا پیش میاد.

برای جلوگیری از این خطا ابتدا مقدار error_reporting در فایل php.ini برابر 0 قرار دهید. با انجام اینکار باعث جلوگیر از عدم نمایش خطا می شویم (البته همه خطا ها، بهتره باشه از لحاظ امنیتی هم خوبه). تا اینجا درست شد.

حال چگونه بفهمیم که این خطا رخ داده ؟؟؟؟ چون که در صورت بروز این خطا متغیر های POST_$ و FILES_$ خالی می شوند.

بهترین و با اطمینان ترین راه استفاده از تابع error_get_last و استفاده از یک متغیر در action فرم آپلود.

به مثال ذیل توجه کنید(این مثال قسمت process اش از php.net و بقیه اش ساخته خودمه) :


<?php
if(isset($_GET['process']) && !count($_POST) && !count($_FILES))
if($err=error_get_last())
if($err['type'] == 2 && $err['file'] == 'Unknown' && $err['line'] == 0 && strpos($err['message'],'POST Content-Length') !== false)
{
echo '<br><b>oooops : your file is very big !(allowed : '.ini_get('upload_max_filesize').')</b><br><br>';
}
?>
<form action="/test.php?process=1" enctype="multipart/form-data" method="post">
<input type="file" name="a" />

vahidqara
جمعه 30 آبان 1393, 14:24 عصر
فکر میکنم اگه به این آموزش نگاه کنی قسمت check filesize متوجه میشی باید چیکار کنی
http://codular.com/php-file-uploads

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

vahidqara
جمعه 30 آبان 1393, 14:25 عصر
راحتترین کار اینه که post_max_size رو به حد کافی افزایش بدین و upload_max_filesize رو تنظیم کنید. اینطوری اگه تو اندیس error فایل مربوطه خطای شماره 1 وجود داشت یعنی از حد مجاز رد شده. مشروح کدهای خطای PHP درمورد آپلود فایل:
http://php.net/manual/en/features.file-upload.errors.php

مچکرم آقای شهرکی.. ولی بازم منطقی به نظر نمیاد چون فایلی که از اون حد بیشتر باشه با خطا مواجه میشه..!!!!:لبخندساده:

vahidqara
جمعه 30 آبان 1393, 14:42 عصر
حالا روشن شد :لبخندساده:

در ادامه فرمایشات جناب آقای شهرکی

نگاه کنید این خطا زمانی رخ می دهد که مقدار upload_max_filezie بیشتر از post_max_size باشد. من این رو خودم به شخصه تست کردم و در کل بطور پیش فرض (اگه خودم دست نکرده باشم) در xampp این تنظیم درست نیست و مقدار upload_max_filesize از post_max_size بیشتر است و این خطا نیز در تست من هم رخ داد.

بهترین راه اش هم آن است که آقای شهرکی گفتند. (اگر دسترسی کامل به php.ini دارید)

اما همیشه ممکن هست این خطا رخ دهد چون در هر صورت بیش تر ارسال بشود خطا پیش میاد.

برای جلوگیری از این خطا ابتدا مقدار error_reporting در فایل php.ini برابر 0 قرار دهید. با انجام اینکار باعث جلوگیر از عدم نمایش خطا می شویم (البته همه خطا ها، بهتره باشه از لحاظ امنیتی هم خوبه). تا اینجا درست شد.

حال چگونه بفهمیم که این خطا رخ داده ؟؟؟؟ چون که در صورت بروز این خطا متغیر های POST_$ و FILES_$ خالی می شوند.

بهترین و با اطمینان ترین راه استفاده از تابع error_get_last و استفاده از یک متغیر در action فرم آپلود.

به مثال ذیل توجه کنید(این مثال قسمت process اش از php.net و بقیه اش ساخته خودمه) :


<?php
if(isset($_GET['process']) && !count($_POST) && !count($_FILES))
if($err=error_get_last())
if($err['type'] == 2 && $err['file'] == 'Unknown' && $err['line'] == 0 && strpos($err['message'],'POST Content-Length') !== false)
{
echo '<br><b>oooops : your file is very big !(allowed : '.ini_get('upload_max_filesize').')</b><br><br>';
}
?>
<form action="/test.php?process=1" enctype="multipart/form-data" method="post">
<input type="file" name="a" />


درود. مچکرم راه حل نسبتا بهتری است ولی error_reporting توی php.ini صفر کنیم منطقی نیست و نمایش تمامی خطاها را از بین میبریم.
حالا من اومدم error_reporting رو تو همون صفحه که آپلود صورت میگیرد اعمال کردم .. ولی جالب بازم خطا نمایش داده میشود!!؟
error_reporting(0);

abolfazl-z
جمعه 30 آبان 1393, 15:41 عصر
درود. مچکرم راه حل نسبتا بهتری است ولی error_reporting توی php.ini صفر کنیم منطقی نیست و نمایش تمامی خطاها را از بین میبریم.

اتفاقا منطقی اش همین هست که بنده عرض کردم و غیر منطقی اش آن هست که خطا نمایش پیدا کند و در ضمن شما می تونید خطا ها را در یک فایل log مشاهده کنید و لازم نیست حتما در صفحه مشاهده کنید.


حالا من اومدم error_reporting رو تو همون صفحه که آپلود صورت میگیرد اعمال کردم .. ولی جالب بازم خطا نمایش داده میشود!!؟

به این خاطر که خطای آپلود رو نمیشه مدیریت کرد و بنده هم برای همین گفتم از php.ini استفاده کنید.

این خطا قبل از اینکه صفحه شما پردازش بشود رخ می دهد و شما میتوانید با گذاشتن یک خروجی در خط اول برنامه تون (1) متوجه بشوید که خطای آپلود قبل از اون به خروجی می رود.

در هر صورت اگر شما نمی خواهید که نمایش همه خطا ها را غیرفعال کنید می توانید با htaccess روی اون فایل دستور error_reporting را اعمال کنید.

درواقع این نوع تنظیم error_reporting برای آپلود از نوع حالت PHP_INI_USER نیست و فقط از حالت های PHP_INI_PERDIR و PHP_INI_SYSTEM قابل تغییر هست که تغییر error_reporting با htaccess از حالت PHP_INI_PERDIR می باشد.

arta.nasiri
جمعه 30 آبان 1393, 15:54 عصر
سلام

واسه غیرفعال کردن خطاهای startup خط زیر رو به htaccess خود اضافه کنید. در ضمن خود PHP هم پیشنهاد میکنه غیر فعال کنیم البته به غیر از مراحل debug.
http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors
البته همچنان با استفاده از این کد خطاهای رخ داده تو سیستم نمایش داده میشن.

php_flag display_startup_errors off

واسه مدیریت خطاها هم میتونید از این تابع استفاده کنید error_get_last()

vahidqara
جمعه 30 آبان 1393, 19:11 عصر
مچکر از
abolfazl-zgrlearnاین خط برام جالب بود abolfazl-z که گفتی : در هر صورت اگر شما نمی خواهید که نمایش همه خطا ها را غیرفعال کنید می توانید با htaccess روی اون فایل دستور error_reporting را اعمال کنید. چطوری اعمال شود روی همون فایل یا صفحه بخصوص؟! :لبخندساده:

و روش grlearn هم خوب بود وقتی تستش کردم. مچکرم. :لبخندساده:

بله آقای abolfazl-z کاملا درسته آپلود قبل از هر چیزی از جمله پردازش رخ میدهد ... مثلا تو فریم ورک ها میان تو متد beforefilter چک میکنند..