PDA

View Full Version : حرفه ای: کلاس آپلود فایل eup v.1



prans.info
پنج شنبه 21 اسفند 1393, 05:45 صبح
سلام دوستان
میخواستم یک فانکشن برای آپلود فایل بنویسم و اینجا بزارم تا اون دسته از دوستانی که نیاز به فانکشنی در این مورد دارند استفاده کنند و خودم هم تو پروژه ها استفاده کنم ...
بغذ به این نتیجه رسیذم فانکشن اون کشش و انعطاف پذیری لازم رو نداره :لبخند: و رفتم سراغ نوشتن کلاس .
این کلاس بسیار انعطاف پذیر هست :

امکان تعین مسیر آپلود و ساخت پوشه در صورت عدم وجود پوشه
امکان تعین دامین برای دریافت خروجی با دامین ...
امکان آپلود به صورت تکی و مولتی + امکان تعین حداکثر تعداد فایل در هنگام آپلود به صورت مولتی
امکان اضافه کردن فرمت های مجاز از طریق آرایه
امکان اضافه کردن MIME های مجاز از طریق آرایه
امکان تعین حجم مجاز آپلود
امکان تعین اینکه اسم فایل هنگام آپلود ری نیم بشه یا نه
امکان تعین اندیس آپلود



هر مورد امنیتی که به ذهنم رسیده رعایت کردم و اگه موردی از قلم افتاده بفرمایید تا اوکی کنم :

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

این کلاس :



class eup {
// Easy Upload Prans :)
private $dir='upload/'; // end = /
private $domin = 'http://site.com/'; // http:// and /
private $random_name = false;
private $max_size = 1048576; //‌ Byte
private $format,$type,$log,$ex;
private $while = 0;
private $method = '<br />';
private $export = '<br />';
public function random_name ($random_name){
$this->random_name = $random_name;
}
public function set_dir ($dir){
if (!is_dir ($dir)){
mkdir ($dir,0775) or die ('مشکلی در ساخت پوشه "'.$dir.'" رخ داد');
}
$this->dir=$dir;
}
public function set_domin ($domin){
$this->domin=$domin;
}
public function set_while ($while){
$this->while=$while;
}
public function max_size ($max_size){
$this->max_size=$max_size;
}
public function valid_format (array $format){
$this->format=$format;
}
public function valid_type (array $type){
$this->type=$type;
}
public function set_log ($method){
$this->method=$method;
}
public function set_export ($method){
$this->export=$method;
}
private function format ($name,$lower=false){
$name = end ( explode ('.',$name));
return ($lower ? strtolower ($name) : $name );
}
private function check_size ($var){
return ($var<=$this->max_size ? true:false);
}
private function check_format ($format){
if ($this->format==null){
die ('لطفا فرمت های مجاز را تعین کنید');
}else{
$new = $this->format;
$new [] = $format;
$new = array_unique ($new);
return ($new==$this->format?true:false);
}
}
private function check_type ($type){
if ($this->type==null){
die ('لطفا MIME های مجاز را تعین کنید');
}else{
$new = $this->type;
$new [] = $type;
$new = array_unique ($new);
return ($new==$this->type?true:false);
}
}
private function get_url (){
return $this->domin.$this->dir;
}
private function file_new_name ($name){
$format = '.'.$this->format ($name);
if ($this->random_name){
return md5 ($name.rand (100000,999999)).$format;
}else{
return str_replace (array ($format,'.'),array ('','_'),$name).$format;
}
}
private function create_unique_name ($name){
$format = '.'.$this->format ($name);
$return = str_replace ($format,'',$name).'-'.date ('Y-m-d_H-i-s').rand (100,999).$format;
if (is_file ($this->dir.$return)){
$this->create_unique_name ($name);
}
return $return;
}

private function add_log ($log){
if ($this->method=='array'){
$this->log[] = $log;
}else{
$this->log .= $log . $this->method;
}
}
private function check_name ($name){
$name = explode ('.',$name);
return (isset ($name ['1'])?true:false);
}
public function log (){
return $this->log;
}
public function export (){
return $this->ex;
}
private function upload_file ($var,$key=''){
if($key!==''){
$var ['error'] = $var ['error'][$key];
$var ['name'] = $var ['name'][$key];
$var ['tmp_name'] = $var ['tmp_name'][$key];
$var ['type'] = $var ['type'][$key];
$var ['size'] = $var ['size'][$key];
}
if ($var ['name']!==''){
if ($var ['error'] <= 0){
if ($this->check_name ($var ['name'])){
if ($this->check_format ($this->format ($var ['name']),true)){
if($this->check_type ($var ['type'])){
if($this->check_size ($var ['size'])){
$var ['old_name'] = $var ['name'];
$var ['name'] = $this->file_new_name ($var ['name']);
if (is_file ($this->dir.$var ['name'])){
$var ['name'] = $this->create_unique_name ($var ['name']);
}
if(move_uploaded_file($var ['tmp_name'],$this->dir.$var ['name'])){
$this->add_log ('فایل "'.$var ['old_name'].'" با موفقیت آپلود شد');
return $this->get_url().$var ['name'];
}else{
$this->add_log ('مشکلی در اجرای عملیات رخ داد (آپلود فایل "'.$var ['old_name'].'")');
}
}else{
$this->add_log ('سایز فایل "'.$var ['name'].'" بیش از اندازه مجاز می باشد');
}
}else{
$this->add_log ('فرمت فایل (MIME) "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('فرمت فایل "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('فایل "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('مشکلی در اجرای عملیات رخ داد (آپلود فایل "'.$var ['name'].'")');
}
}
}
public function upload ($var_name){
if($this->while){
$array = array ();
foreach ($var_name as $key=> $value){
$var [$key] = $value;
}
$num = 0;
$this->while = ($this->while=='auto'?count ($var):$this->while);
while ($num<$this->while){
$temp = $this->upload_file ($var,$num);
if($temp){
if($this->export=='array'){
$export [] = $temp;
}else{
$export .= $temp.$this->export;
}
}
$num++;
}
$this->ex = ($export?$export:false);
}else{
$this->ex = $this->upload_file ($var_name);
}
}
}
if (isset ($_POST ['ok'])){
$upload = new eup;
$upload->set_dir ('prans_upload/'); // نیمه الزامی
$upload->set_domin ('http://prans.info/'); // نیمه الزامی
$upload->set_log ('<br />'); // اختیاری
$upload->set_export ('<br />'); // اختیاری
$upload->set_while ('auto'); // اختیاری
$upload->random_name (false); // اختیاری
$upload->valid_format (array ('png','jpg','jpeg','gif','pdf','rar','zip')); // الزامی
$upload->valid_type (array ('image/png','image/jpg','image/jpeg','image/gif','application/x-rar-compressed','application/pdf','application/zip','application/x-rar')); // الزامی
$upload->upload ($_FILES ['prans']); // الزامی
print_r ($upload->export()); // اختیاری
print_r ($upload->log()); // اختیاری
}

داغه داغه :لبخند:
این هم دوتا مثال برای آپلود :
1- به صورت تکی / ساده :


<?php
if (isset ($_POST ['ok'])){
$upload = new eup;
$upload->set_dir ('prans_upload/'); // نیمه الزامی
$upload->set_domin ('http://prans.info/'); // نیمه الزامی
$upload->set_log ('<br />'); // اختیاری
$upload->set_export ('<br />'); // اختیاری
$upload->set_while (0); // اختیاری
$upload->random_name (false); // اختیاری
$upload->valid_format (array ('png','jpg','jpeg','gif','pdf','rar','zip')); // الزامی
$upload->valid_type (array ('image/png','image/jpg','image/jpeg','image/gif','application/x-rar-compressed','application/pdf','application/zip','application/x-rar')); // الزامی
$upload->upload ($_FILES ['prans']); // الزامی
print_r ($upload->export()); // اختیاری
print_r ($upload->log()); // اختیاری
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="prans">
<br />
<input type="submit" name="ok" value="آپلود !">
</fotm>

2- به صورت مولتی آپلود (چند تایی) :


<?php
if (isset ($_POST ['ok'])){
$upload = new eup;
$upload->set_dir ('prans_upload/'); // نیمه الزامی
$upload->set_domin ('http://prans.info/'); // نیمه الزامی
$upload->set_log ('<br />'); // اختیاری
$upload->set_export ('<br />'); // اختیاری
$upload->set_while ('auto'); // اختیاری
$upload->random_name (false); // اختیاری
$upload->valid_format (array ('png','jpg','jpeg','gif','pdf','rar','zip')); // الزامی
$upload->valid_type (array ('image/png','image/jpg','image/jpeg','image/gif','application/x-rar-compressed','application/pdf','application/zip','application/x-rar')); // الزامی
$upload->upload ($_FILES ['prans']); // الزامی
print_r ($upload->export()); // اختیاری
print_r ($upload->log()); // اختیاری
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="submit" name="ok" value="آپلود !">
</fotm>


البته بعضی جاها میتونه بهینه تر نوشته بشه که بعدا روش کار می کنم :لبخند:.

H:Shojaei
پنج شنبه 21 اسفند 1393, 12:25 عصر
عالی بود...
بهتر نیست بعضی توابع به constructor ربط بدیم و عملیات مقدار دهی به متغیر های کلاس (که دقیقا کار constructor همین هست) رو داخل اون انجام بدیم که هم کد خوانا تر بشه هم استفاده ازش راحت تر...
مثلا یه با مینویسیم:


$upload = new eup('prans_upload/','http://prans.info/',...);
print_r ($upload->upload ($_FILES ['prans']));

H:Shojaei
پنج شنبه 21 اسفند 1393, 12:36 عصر
و یه چیز دیگه به نظرم اون پیغام هایی که داره رو برگردونید از کلاس به برنامه اصلی که کاربر خودش تصمیم بگیره کجا نمایشش بده الآن هرجا کلاس و توابعش فراخوانی بشن همونجا پیغام ها هم نمایش داده میشن...
کلا توی کلاس بهتره چیزی پرینت نشه چون نمیدونیم کجا صداش میزنیم...!

prans.info
پنج شنبه 21 اسفند 1393, 13:38 عصر
ورژن 1.1 : :لبخند:


class eup {
// Easy Upload Prans :)
private $dir='upload/'; // end = /
private $domin = 'http://site.com/'; // http:// and /
private $random_name = false;
private $max_size = 1048576; //‌ Byte
private $format,$type,$log;
private $while = 0;
private $method = 'PHP_EOL';
private function random_name ($random_name){
$this->random_name = $random_name;
}
public function set_dir ($dir){
if (!is_dir ($dir)){
mkdir ($dir,0775) or die ('مشکلی در ساخت پوشه "'.$dir.'" رخ داد');
}
$this->dir=$dir;
}
public function set_domin ($domin){
$this->domin=$domin;
}
public function set_while ($while){
$this->while=$while;
}
public function max_size ($max_size){
$this->max_size=$max_size;
}
public function valid_format (array $format){
$this->format=$format;
}
public function valid_type (array $type){
$this->type=$type;
}
public function set_log ($method){
$this->method=$method;
}
private function format ($name,$lower=false){
$name = end ( explode ('.',$name));
return ($lower ? strtolower ($name) : $name );
}
private function check_size ($var){
return ($var<=$this->max_size ? true:false);
}
private function check_format ($format){
if ($this->format==null){
die ('لطفا فرمت های مجاز را تعین کنید');
}else{
$new = $this->format;
$new [] = $format;
$new = array_unique ($new);
return ($new==$this->format?true:false);
}
}
private function check_type ($type){
if ($this->type==null){
die ('لطفا MIME های مجاز را تعین کنید');
}else{
$new = $this->type;
$new [] = $type;
$new = array_unique ($new);
return ($new==$this->type?true:false);
}
}
private function get_url (){
return $this->domin.$this->dir;
}
private function file_new_name ($name){
$format = '.'.$this->format ($name);
if ($this->random_name){
return md5 ($name.rand (100000,999999)).$format;
}else{
return str_replace (array ($format,'.'),array ('','_'),$name).$format;
}
}
private function create_unique_name ($name){
$format = '.'.$this->format ($name);
$return = str_replace ($format,'',$name).'-'.date ('Y-m-d_H-i-s').rand (100,999).$format;
if (is_file ($this->dir.$return)){
$this->create_unique_name ($name);
}
return $return;
}

private function add_log ($log){
/*if ($this->method=='PHP_EOL'){
$this->log .= $log . PHP_EOL;
}else */if ($this->method=='array'){
$this->log[] = $log;
}else{
$this->log .= $log . $this->method;
}
}
public function log (){
return $this->log;
}
private function upload_file ($var,$key=''){
if($key!==''){
$var ['error'] = $var ['error'][$key];
$var ['name'] = $var ['name'][$key];
$var ['tmp_name'] = $var ['tmp_name'][$key];
$var ['type'] = $var ['type'][$key];
$var ['size'] = $var ['size'][$key];
}
if ($var ['name']!==''){
if ($var ['error'] <= 0){
if ($this->check_format ($this->format ($var ['name']),true)){
if($this->check_type ($var ['type'])){
if($this->check_size ($var ['size'])){
$var ['old_name'] = $var ['name'];
$var ['name'] = $this->file_new_name ($var ['name']);
if (is_file ($this->dir.$var ['name'])){
$var ['name'] = $this->create_unique_name ($var ['name']);
}
if(move_uploaded_file($var ['tmp_name'],$this->dir.$var ['name'])){
$this->add_log ('فایل "'.$var ['old_name'].'" با موفقیت آپلود شد');
return $this->get_url().$var ['name'];
}else{
$this->add_log ('مشکلی در اجرای عملیات رخ داد (آپلود فایل "'.$var ['old_name'].'")');
}
}else{
$this->add_log ('سایز فایل "'.$var ['name'].'" بیش از اندازه مجاز می باشد');
}
}else{
$this->add_log ('فرمت فایل "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('فرمت فایل "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('مشکلی در اجرای عملیات رخ داد (آپلود فایل "'.$var ['name'].'")');
}
}
}
public function upload ($var_name){
if($this->while){
$array = array ();
foreach ($var_name as $key=> $value){
$var [$key] = $value;
}
$num = 0;
while ($num<$this->while){
$temp = $this->upload_file ($var,$num);
if($temp){
$array [] = $temp;
}
$num++;
}
return ($array?$array:false);
}else{
return $this->upload_file ($var_name);
}
}
}

تغییرات و امکانات جدید :

کامل شدن get_url
قرار گیری ارور ها و پیام ها در داخل متغیر
امکان دسترسی به ارور ها در هر جای اسکریپت
امکان مشخص کردن نحوه ذخیره کردن لاگ ها (به صورت array یا اضافه کردن یک چیز خاص به آخر لاگ مثلا PHP_EOL یا <br />)
اضافه شدن اسم فایل ها به ارور ها و پیام ها
حل یک مشکل کوچک در حالت آپلود چند تایی

پست اول ویرایش و کلاس جدید قرار داده شد
منتظر پیشنهادات و انتقادات شما عزیزان هستیم :لبخند:

mohammad425
پنج شنبه 21 اسفند 1393, 13:55 عصر
چه زود ورژن جدیدش اومد:لبخند: اینجوری پیش بره تا شب ورژن 10 هم میاد:لبخند::لبخند::قهقهه:
قبل آدرس اینو مینویسه: Array ( [0] => که زشت میشه و بهتره آدرس فایل توی textarea نشون داده بشه :چشمک:

prans.info
پنج شنبه 21 اسفند 1393, 13:59 عصر
چه زود ورژن جدیدش اومد:لبخند: اینجوری پیش بره تا شب ورژن 10 هم میاد:لبخند::لبخند::قهقهه:
قبل آدرس اینو مینویسه: Array ( [0] => که زشت میشه و بهتره آدرس فایل توی textarea نشون داده بشه :چشمک:
:لبخند:
خب تغییر میدیم باید ورژن هم تغییر کنه :لبخند: و باید 9 تا تغییر اساسی دیگه بدیم تا تازه بره ورژن 2 .
ما تویه مثال از print_r استفاده کردیم شما میتونید با یک حلقه هر طور خواستید چاپ کنید .

H:Shojaei
پنج شنبه 21 اسفند 1393, 14:13 عصر
یه چیز دیگه :لبخند: بهتر نیست به جای این متغیر while که تعداد فایل رو مشخص میکنه یه count از $_FILES['uploaded'] بگیریم کار کسی که باهاش کار میکنه راحت تر میشه... خود برنامه تشخیص میده چند تا فایل آپ شده...

prans.info
پنج شنبه 21 اسفند 1393, 14:28 عصر
یه چیز دیگه :لبخند: بهتر نیست به جای این متغیر while که تعداد فایل رو مشخص میکنه یه count از $_FILES['uploaded'] بگیریم کار کسی که باهاش کار میکنه راحت تر میشه... خود برنامه تشخیص میده چند تا فایل آپ شده...
برای این اینطوری گذاشتم که برنامه نویس بتونه تعداد رو مشخص کنه و کاربر بیشتر نتونه آپلود کنه که الان فکر می کنم می بینم کاربرد خاصی نداره :لبخند:
به هر حال تویه تغییر بعدی یک حالت auto هم براش تعریف می کنیم که پیش فرضش میشه ...

abbas27
پنج شنبه 21 اسفند 1393, 19:23 عصر
یه پیشنهاد.برای renameکردن فایل به نظرم از این استفاده بشه بهتر نیست؟چون کارکتر تکراری بر نمیگردونه.



md5($name.microtime());

prans.info
پنج شنبه 21 اسفند 1393, 19:28 عصر
یه پیشنهاد.برای renameکردن فایل به نظرم از این استفاده بشه بهتر نیست؟چون کارکتر تکراری بر نمیگردونه.



md5($name.microtime());


rename به صورت تصادفی رو اگه فعال کنید همین کار انجام میشه ولی به صورت پیش فرض غیر فعال هست و اسم خود فایل رو برمیگردونه .
کافیه اینطوری فعال کنید :


$upload->random_name (true);

abbas27
پنج شنبه 21 اسفند 1393, 20:17 عصر
من یه سوال ازprans.info از طریق پیام خصوصی پرسیدم که ایشون زحمت کشیدن و جوابش رو دادن و پاسخشون رو میزارم واسه بقیه دوستان.از زحمات ایشون هم تشکر میکنم.من خواستم فایلهایی بجز تصویر هم آپلود کنم که ایشون اینجوری راهنمایی کردن.
باید فرمت رو از طریق valid_format و تایپ رو از طریق valid_type به کلاس معرفی کنید .
برای پی دی اف و رار :


$upload->valid_format (array ('png','jpg','jpeg','gif','pdf','rar'));
$upload->valid_type (array ('image/png','image/jpg','image/jpeg','image/gif','application/x-rar-compressed','application/pdf'));




لیست تایپ ها :
http://www.freeformatter.com/mime-types-list.html

abbas27
پنج شنبه 21 اسفند 1393, 20:20 عصر
من قبل از اینکه تایپ های rar, pdf رو به کلاس اضافه کنم اومدم یه فایل از نوع پی دی اف و یه فایل از نوع rar رو با پسوند عکس آپلود کردم و آپلود انجام شد.آیا باید آپلود صورت بگیره؟

prans.info
پنج شنبه 21 اسفند 1393, 20:25 عصر
من قبل از اینکه تایپ های rar, pdf رو به کلاس اضافه کنم اومدم یه فایل از نوع پی دی اف و یه فایل از نوع rar رو با پسوند عکس آپلود کردم و آپلود انجام شد.آیا باید آپلود صورت بگیره؟
این خط رو :


echo $var ['type'];

قبل از :


$this->add_log ('فایل "'.$var ['old_name'].'" با موفقیت آپلود شد');

بزارید .
اگه چیزی که هنگام آپلود چاپ میشه چنین چیزی بود : image/png و جز تایپ های مجاز بود مشکلی وجود نداره و وقتی شما فرمت رو عوض کردید تایپ فایل هم چنج شده وگرنه این یک باگ هست و باید بررسی کنیم .

abbas27
پنج شنبه 21 اسفند 1393, 20:43 عصر
این خط رو :


echo $var ['type'];

قبل از :


$this->add_log ('فایل "'.$var ['old_name'].'" با موفقیت آپلود شد');

بزارید .
اگه چیزی که هنگام آپلود چاپ میشه چنین چیزی بود : image/png و جز تایپ های مجاز بود مشکلی وجود نداره و وقتی شما فرمت رو عوض کردید تایپ فایل هم چنج شده وگرنه این یک باگ هست و باید بررسی کنیم .

1-من فرمت rarوpdf رو از طریق valid_format و تایپ رو از طریق valid_type به کلاس معرفی کردم اما باز هم پیغام میده فرمت مجاز نیست.
2-واسه تغییر پسوند فایل هم تست کردم یه بار بدون تغییر پسوند که پیغام نوع فرمت غیر مجاز رو داد اما وقتی پسوند فایل رار رو به png تغییر دادم پیغام زیر نمایش داده شد
قبل از تغییر فرمت:
فرمت فایل "New WinRAR archive.rar" شده مجاز نیست
بعد از تغییر فرمت:
image/pnghttp://prans.info/prans_upload/New WinRAR archive-2015-03-12_17-55-41598.pngفایل "New WinRAR archive.png" با موفقیت آپلود شد

prans.info
پنج شنبه 21 اسفند 1393, 21:00 عصر
1-من فرمت rarوpdf رو از طریق valid_format و تایپ رو از طریق valid_type به کلاس معرفی کردم اما باز هم پیغام میده فرمت مجاز نیست.
2-واسه تغییر پسوند فایل هم تست کردم یه بار بدون تغییر پسوند که پیغام نوع فرمت غیر مجاز رو داد اما وقتی پسوند فایل رار رو به png تغییر دادم پیغام زیر نمایش داده شد
قبل از تغییر فرمت:
فرمت فایل "New WinRAR archive.rar" شده مجاز نیست
بعد از تغییر فرمت:
image/pnghttp://prans.info/prans_upload/New WinRAR archive-2015-03-12_17-55-41598.pngفایل "New WinRAR archive.png" با موفقیت آپلود شد

ظاهرا تایپ فایل rar این هست 'application/x-rar'
من با این کد هم pdf هم عکس هم zip و rar آپلود کردم



if (isset ($_POST ['ok'])){
$upload = new eup;
$upload->set_dir ('prans_upload/');
$upload->set_domin ('http://prans.info/');
$upload->set_log ('<br />');
// $upload->set_while (3);
// $upload->random_name (true);
$upload->valid_format (array ('png','jpg','jpeg','gif','pdf','rar','zip'));
$upload->valid_type (array ('image/png','image/jpg','image/jpeg','image/gif','application/x-rar-compressed','application/pdf','application/zip','application/x-rar'));
print_r ($upload->upload ($_FILES ['prans']));
print_r ($upload->log());
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="prans">
<br />
<input type="submit" name="ok" value="آپلود !">
</fotm>


موردی هم که فرمودید بررسی کردم
هنگام نغییر فرمت تایپ فایل هم عوض میشه وگرنه اگه تایپ یه چیز دیگه باشه کار نمی کنه :چشمک:

abbas27
پنج شنبه 21 اسفند 1393, 22:04 عصر
من همینجور نشستم تست میکنم.فایل rar توی موزیلا آپلود میشه اما توی کروم و ie نمیشه.فایل zipهم توی هیچکدوم آپلود نمیشه.فایل pdf توی کروم و ie آپلود میشه اما توی موزیلا نمیشه.
بعد واسه تغییر نام این خط رو trueکردم اما خطا میده:


$upload->random_name (true);

Fatal error: Call to private method eup::random_name() from context '' in C:\xampp\htdocs\shoping\object\upload.php on line 165

prans.info
پنج شنبه 21 اسفند 1393, 22:24 عصر
من همینجور نشستم تست میکنم.فایل rar توی موزیلا آپلود میشه اما توی Chromiumو ie نمیشه.فایل zipهم توی هیچکدوم آپلود نمیشه.فایل pdf توی Chromiumو ie آپلود میشه اما توی موزیلا نمیشه.
بعد واسه تغییر نام این خط رو trueکردم اما خطا میده:


$upload->random_name (true);

Fatal error: Call to private method eup::random_name() from context '' in C:\xampp\htdocs\shoping\object\upload.php on line 165
اون مروبط به تایپ فایل هست که باید تایپ ها رو وارد کنید ...
درمورد random_name هم به اشتباه private زده شده بود تا ورژن 1.2 شما این تغییر رو بدید :
تبدیل :


private function random_name

به :


public function random_name

prans.info
پنج شنبه 21 اسفند 1393, 23:29 عصر
من همینجور نشستم تست میکنم.فایل rar توی موزیلا آپلود میشه اما توی کروم و ie نمیشه.فایل zipهم توی هیچکدوم آپلود نمیشه.فایل pdf توی کروم و ie آپلود میشه اما توی موزیلا نمیشه.

مشکل از فایل شماست MIME تایپ این فایل unknown/unknown هست .
اگه میخواید این فایل آپلود بشه باید تایپ unknown/unknown رو هم مجاز بزارید . :چشمک:
بعضی فایل ها MIME های چند تایی دارند و بستگی به نحویه ساختشون داره و شما باید همیه type ها رو که مربوط به اون فایل هست و مجاز کنید.
در پایان MIME های کاربری رو اینجا قرار خواهم داد :چشمک:
چند دقیقه دیگه ورژن 1.2 رو با امکانات بیشتر و بهتر میزارم :لبخند:

prans.info
پنج شنبه 21 اسفند 1393, 23:37 عصر
ورژن 1.2 : :لبخند:


<?php
class eup {
// Easy Upload Prans :)
private $dir='upload/'; // end = /
private $domin = 'http://site.com/'; // http:// and /
private $random_name = false;
private $max_size = 1048576; //‌ Byte
private $format,$type,$log,$ex;
private $while = 0;
private $method = '<br />';
private $export = '<br />';
public function random_name ($random_name){
$this->random_name = $random_name;
}
public function set_dir ($dir){
if (!is_dir ($dir)){
mkdir ($dir,0775) or die ('مشکلی در ساخت پوشه "'.$dir.'" رخ داد');
}
$this->dir=$dir;
}
public function set_domin ($domin){
$this->domin=$domin;
}
public function set_while ($while){
$this->while=$while;
}
public function max_size ($max_size){
$this->max_size=$max_size;
}
public function valid_format (array $format){
$this->format=$format;
}
public function valid_type (array $type){
$this->type=$type;
}
public function set_log ($method){
$this->method=$method;
}
public function set_export ($method){
$this->export=$method;
}
private function format ($name,$lower=false){
$name = end ( explode ('.',$name));
return ($lower ? strtolower ($name) : $name );
}
private function check_size ($var){
return ($var<=$this->max_size ? true:false);
}
private function check_format ($format){
if ($this->format==null){
die ('لطفا فرمت های مجاز را تعین کنید');
}else{
$new = $this->format;
$new [] = $format;
$new = array_unique ($new);
return ($new==$this->format?true:false);
}
}
private function check_type ($type){
if ($this->type==null){
die ('لطفا MIME های مجاز را تعین کنید');
}else{
$new = $this->type;
$new [] = $type;
$new = array_unique ($new);
return ($new==$this->type?true:false);
}
}
private function get_url (){
return $this->domin.$this->dir;
}
private function file_new_name ($name){
$format = '.'.$this->format ($name);
if ($this->random_name){
return md5 ($name.rand (100000,999999)).$format;
}else{
return str_replace (array ($format,'.'),array ('','_'),$name).$format;
}
}
private function create_unique_name ($name){
$format = '.'.$this->format ($name);
$return = str_replace ($format,'',$name).'-'.date ('Y-m-d_H-i-s').rand (100,999).$format;
if (is_file ($this->dir.$return)){
$this->create_unique_name ($name);
}
return $return;
}

private function add_log ($log){
if ($this->method=='array'){
$this->log[] = $log;
}else{
$this->log .= $log . $this->method;
}
}
private function check_name ($name){
$name = explode ('.',$name);
return (isset ($name ['1'])?true:false);
}
public function log (){
return $this->log;
}
public function export (){
return $this->ex;
}
private function upload_file ($var,$key=''){
if($key!==''){
$var ['error'] = $var ['error'][$key];
$var ['name'] = $var ['name'][$key];
$var ['tmp_name'] = $var ['tmp_name'][$key];
$var ['type'] = $var ['type'][$key];
$var ['size'] = $var ['size'][$key];
}
if ($var ['name']!==''){
if ($var ['error'] <= 0){
if ($this->check_name ($var ['name'])){
if ($this->check_format ($this->format ($var ['name']),true)){
if($this->check_type ($var ['type'])){
if($this->check_size ($var ['size'])){
$var ['old_name'] = $var ['name'];
$var ['name'] = $this->file_new_name ($var ['name']);
if (is_file ($this->dir.$var ['name'])){
$var ['name'] = $this->create_unique_name ($var ['name']);
}
if(move_uploaded_file($var ['tmp_name'],$this->dir.$var ['name'])){
$this->add_log ('فایل "'.$var ['old_name'].'" با موفقیت آپلود شد');
return $this->get_url().$var ['name'];
}else{
$this->add_log ('مشکلی در اجرای عملیات رخ داد (آپلود فایل "'.$var ['old_name'].'")');
}
}else{
$this->add_log ('سایز فایل "'.$var ['name'].'" بیش از اندازه مجاز می باشد');
}
}else{
$this->add_log ('فرمت فایل (MIME) "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('فرمت فایل "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('فایل "'.$var ['name'].'" شده مجاز نیست');
}
}else{
$this->add_log ('مشکلی در اجرای عملیات رخ داد (آپلود فایل "'.$var ['name'].'")');
}
}
}
public function upload ($var_name){
if($this->while){
$array = array ();
foreach ($var_name as $key=> $value){
$var [$key] = $value;
}
$num = 0;
$this->while = ($this->while=='auto'?count ($var):$this->while);
while ($num<$this->while){
$temp = $this->upload_file ($var,$num);
if($temp){
if($this->export=='array'){
$export [] = $temp;
}else{
$export .= $temp.$this->export;
}
}
$num++;
}
$this->ex = ($export?$export:false);
}else{
$this->ex = $this->upload_file ($var_name);
}
}
}
?>


مثال :



if (isset ($_POST ['ok'])){
$upload = new eup;
$upload->set_dir ('prans_upload/'); // نیمه الزامی
$upload->set_domin ('http://prans.info/'); // نیمه الزامی
$upload->set_log ('<br />'); // اختیاری
$upload->set_export ('<br />'); // اختیاری
$upload->set_while ('auto'); // اختیاری
$upload->random_name (false); // اختیاری
$upload->valid_format (array ('png','jpg','jpeg','gif','pdf','rar','zip')); // الزامی
$upload->valid_type (array ('image/png','image/jpg','image/jpeg','image/gif','application/x-rar-compressed','application/pdf','application/zip','application/x-rar')); // الزامی
$upload->upload ($_FILES ['prans']); // الزامی
print_r ($upload->export()); // اختیاری
print_r ($upload->log()); // اختیاری
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="file" name="prans[]">
<br />
<input type="submit" name="ok" value="آپلود !">
</fotm>



امکان اوتوماتیک (مولتی) کردن متغیر while و چرخه آپلود
امکان نمایش لینک های فایل ها در هر مکان از اسکریپت (مانند نمایش ارور و پیام ها)
امکان تعین نحوه جدا سازی لینک های فایل ها (به صورت آرایه یا هر چیز دیگر ...)
چکر جدید برای جلوگیری از آپلود فایل بدون اسم
حل چند مشکل گزارش شده

پست اول ویرایش شد

abbas27
جمعه 22 اسفند 1393, 01:00 صبح
واسه فایلهای zip این mime ها رو اضافه کردم درست شد حتما مشکل فایلهای pdf هم همینجور هست.



.zip

application/x-compressed


.zip

application/x-zip-compressed


.zip

application/zip


.zip

multipart/x-zip

MMSHFE
جمعه 22 اسفند 1393, 02:25 صبح
سعی کنید استاندارد بنویسید. مطمئن نیستم این کلاسی که من از روی کلاس شما نوشتم کار میکنه چون تست نکردم (البته نباید مشکل خاصی داشته باشه) ولی با این حال، تفاوتهای یک کد که با استانداردها مطابقت داره رو با کدی که خودتون نوشتین، میتونید مشاهده کنید و کلاس خوبی که نوشتین رو ارتقا بدین:

/**
* Easy Upload
* @author Prans
* @version 1.3
*
* The followings are the available columns in table 'agents':
* @property string $dir
* @property string $domain
* @property boolean $randomName
* @property integer $maxSize
* @property array $mimeTypes
* @property array $extensions
* @property string $log
* @property boolean $multiple
* @property string $method
* @property array $result
*/
class EUP
{
/**
* @var Attributes
*/
private $_attributes = array(
'dir' => 'upload/',
'domain' => 'http://localhost/',
'randomName' => false,
'maxSize' => 1048576,
'mimeTypes' => array(),
'extensions' => array(),
'log' => '',
'multiple' => false,
'method' => '',
'result' => array(),
);

/**
* Magic Getter method
* @param string $name The name of attribute
*
* @return mixed The value of attribute
*/
public function __GET($name)
{
if(isset($this->_attributes)) {
return $this->_attributes[$name];
}
}

/**
* Magic setter method
* @param string $name The name of attribute
* @param mixed $value The value of attribute
*/
public function __SET($name, $value)
{
if(isset($this->_attributes)) {
$this->_attributes[$name] = $value;
}
}

/**
* Create dir if not exists
*/
private function createDir()
{
if(!file_exists($this->dir) || !is_dir($this->dir)) {
mkdir($dir, 0755) or die('مشکلی در ساخت پوشه "' . $this->dir . '" رخ داد');
}
}

/**
* Get the file extension
* @param string $name The filename
* @param boolean $lower Whether to return the extension in lowercase
*
* @return string The file extension
*/
private function getExtension($name, $lower = false)
{
mb_internal_encoding('utf-8');
$ext = mb_substr($name, mb_strrpos($name, '.') + 1);
return ($lower ? strtolower ($ext) : $ext);
}

/**
* Check the size
* @param integer $size The size to check
*
* @return boolean Whether the size is valid
*/
private function checkSize($size)
{
return ($size <= $this->maxSize);
}

/**
* Check the extension
* @param string $extension The extension to check
*
* @return boolean Whether the extension is valid
*/
private function checkExtension($extension)
{
return in_array($extension, $this->extensions);
}

/**
* Check the MIME type
* @param string $mimeType The MIME type to check
*
* @return boolean Whether the MIME type is valid
*/
private function checkMimeType($mimeType)
{
return in_array($mimeType, $this->mimeTypes);
}

/**
* Get the upload folder URL
* @return string The upload folder URL
*/
private function getUrl()
{
return $this->domain . $this->dir;
}

/**
* Get the safe filename based on the original name
* @param string $name The original filename
*
* @return string The new filename
*/
private function newFileName($name)
{
$extension = '.' . $this->getExtension($name);
$newName = ($this->random_name ? md5($name . rand(100000, 999999)) : str_replace('.', '-', basename($name)));
return $newName . $extension;
}

/**
* Create a unique name
* @param string $name The original filename
*
* @return string The new filename
*/
private function uniqueName($name)
{
$baseName = basename($name);
$extension = $this->getExtension($name);
$counter = 2;
while(file_exists($name)) {
$name = $baseName . '-' . $counter . $extension;
$counter++;
}
return $name;
}

/**
* Add log
* @param string $log The log to add
*/
private function addLog($log)
{
if($this->method == 'array') {
$this->log[] = $log;
}
else {
$this->log .= $log . PHP_EOL;
}
}

/**
* Do the real upload process
* @param array $element The file element (an element of $_FILES array)
*
* @return boolean|false The uploaded file URL on success, false otherwise
*/
private function uploadFile($element)
{
list($name, $tempName, $error, $size, $mimeType) = array($element['name'], $element['tmpName'], $element['error'], $element['size'], $element['type']);
if($name !== '') {
if($error == 0) {
if($this->checkExtension($this->getExtension($name))) {
if($this->checkMimeType($mimeType)) {
if($this->checkSize($size)) {
$newName = $this->newFileName($name);
$newName = $this->uniqueName($newName);
if(move_uploaded_file($tempName, $this->dir . $newName)) {
$this->addLog('فایل "' . $name . '" با موفقیت آپلود شد');
return $this->getUrl() . $name;
}
else {
$this->addLog('مشکلی در اجرای عملیات رخ داد (آپلود فایل "' . $name . '")');
}
}
else {
$this->addLog('سایز فایل "' . $name . '" بیش از اندازه مجاز می باشد');
}
}
else {
$this->addLog('فرمت فایل (MIME) "' . $name . '" مجاز نیست');
}
}
else {
$this->addLog('پسوند فایل "' . $name . '" مجاز نیست');
}
}
else {
$this->addLog('مشکلی در اجرای عملیات رخ داد (آپلود فایل "' . $name . '")');
}
}
else {
$this->addLog('فایلی برای آپلود انتخاب نشده است');
}
return false;
}

/**
* Execute the upload process
* @param array $element (an element of $_FILES array)
*
* @return array|string The upload result in single mode or an array of results in multiple mode
*/
public function upload($element) {
if($this->multiple) {
foreach($element as $key => $value) {
$this->result[$key] = $this->uploadFile($value);
}
return $this->result;
}
return $this->uploadFile($element);
}
}

prans.info
جمعه 22 اسفند 1393, 02:56 صبح
ممنون از جناب شهرکی بابت وقتی که رو این کلاس گذاشتند .
والا این دومین کلاس من هست که نوشتم (قبلی رو نمیشه کلاس حساب کرد :لبخند:) البته بدون هیچ تمرینی و فقط با اتکا به داکیومنت هایی که قبلا دیده بودم و از یک طرف بخاطر اینکه تو ساعت خستگی این کار رو کردم زیاد مغزم کار نکرده و از طرفی هم دانش و تجربه ام من در زمینه کلاس خیلی کمه ...
در مورد بهینه نبودنش میدونستم مثلا برای هیمن ست کردن متغییر ها میشه از یک تابع استفاده کرد و برای هر کدوم یک تابع نساخت یا اینکه یک سری توابع و مخصوصا حلفه آپلود میتونه بهینه تر باشه ولی یک سری موارد و اصلا نمیدونستم چطوری میتونم بهینه ترش کنم .
به هر حال ممنون از شما .
ان شا الله به زودی ترکیبی از کلاس خودم و شما میسازم و همینجا قرار میدم تا شاید به درد بقیه دوستان هم بخوره .

abbas27
چهارشنبه 27 اسفند 1393, 17:27 عصر
ما همچنان منتظر نسخه جدید هستیم.

prans.info
چهارشنبه 27 اسفند 1393, 20:19 عصر
ما همچنان منتظر نسخه جدید هستیم.
این روز ها کمی سرم شلوغه و نمی تونم زیاد وقت بزارم ولی به زودی کلاس جدید eup رو قرار میدم .
یک کلاس کاربردی دیگه (کلاس صفحه بندی) هم به زودی میسازم و تویه همین انجمن به اشتراک میزارم .