رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
multiple upload
#1
سلام دوستان چند تا مشکمل در رابطه با آپلود چندگانه فایل ها دارم .

من یه فرم html دارم که دارای 5 تا input فایل است به این صورت :

<input type="file" title="No File Chosen" name="field_name[]" id="field_name[]"  />

من اول اومدم یه تابع که دورن سایت php هم توضیح داده بود نوشتم تا بتونم به خونه های آرایم دسترسی داشته باشم به این صورت :

function reArrayFiles(&$file_post) {

	  $file_ary = array();
	  $file_count = count($file_post['name']);
	  $file_keys = array_keys($file_post);
  
	  for ($i=0; $i<$file_count; $i++) {
		  foreach ($file_keys as $key) {
			  $file_ary[$i][$key] = $file_post[$key][$i];
		  }
	  }
  
	  return $file_ary;
  }

بعد از بررسی کردن submit فرم اومدم تابمو فراخوانی کردم به این صورت :

$file_ary = reArrayFiles($_FILES['field_name']);


بعد اومدم با یه حلقه Foreach تک تک دستورات آپلود پیاده کردم :

foreach($file_ary as $file)
		   {
		   
		          $fname = $file['name'];
				  $fsize = $file['size'] / 1024;
				  $fname_type = strtolower($fname); 
				  $exploded = explode('.',$fname_type);
				  $ftype = end($exploded);   
				  
				 
				 //......................................................................................
				 
				 if($file['error']>0)
				 {
					 
					 switch($file['error'])
					 {
						 //Error Translation	
						 //...............................................................................	 
						 case 0 : echo"there is no error" ; break;
						 case 1 : echo"The uploaded file exceeds the upload_max_filesize directive in php.ini."; break;	
						 case 2 : echo"فایلی انتخابی شما حجمش بیش از حد مجاز تعریف شده می باشد."; break;
						 case 3 : echo"فایل ناقص آپلود شده است"; break;
						 case 4 : echo"هیچ فایلی آپلود نشده است!"; break;
						 case 6 : echo"Missing a temporary folder. Introduced in PHP 5.0.3."; break;
						 case 7 : echo"Failed to write file to disk. Introduced in PHP 5.1.0."; break;
						 case 8 : echo"A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.";             break;
					 }
					 
					 
				 }else
				 {
					 
					  
							  
					  // checks if the file already exists
					  if (file_exists($updir. $fname)) 
					  {
							
						  echo'<div class="alert alert-error">';	
						  echo 'THERE IS SUCH  '.$fname.' FILE In DIRECTORY';
						  echo '</div>';
					  }
					  else
					  {
					  
						// if the file not exists, check its type (by extension) and size
						if (in_array($ftype, $allowtype)) 
						{
						  // check the size
						  if ($fsize <= $max_size) 
						  {
							// uses  function to copy the file from temporary folder to $updir
							if (!move_uploaded_file ($file['tmp_name'], $updir. $fname)) 
							{
								
							  echo'<div class="alert alert-error">';
							  echo 'فایل '. $fname. ' موفق به کپی برداری نشده است ، لطفاً مجدد تلاش کنید';
							  echo '</div>';
							}
							else 
							{
							  
							  echo $fname. ' ('. $fsize. ' kb) فایل با موفقیت آپلود شد';
							  print_r( move_uploaded_file ($file['tmp_name'], $updir. $fname));
							  
							  $savedpath = ADDR."repository/".$file['name'];
							  $_SESSION['Listening'][] = $savedpath;
							  
							  
							  
							  
							  
							}
						  }
					   }
					 
					  }
			 
				 }
		  
		     echo "<br>";
		  
		    }

اما اینجا چند تا مشکل دارم :
1.ممکنه کاربر به هر دلیلی یکی از input ها رو خالی رد کنه و بعد فرمو ثبت کنه که من نمی خوام اینطوری بشه چون بقیه file ها آپلود میشن اما این یکی نمیشه در واقع فقط و فقط همه باهم باید آپلود بشن . این مشکل مکنه به دلیل پذیرفته نشدن type هم پیش بیاد یعنی کاربر بیاد نوع فایل غیر مجاز آپلود کنه که بازم همون مشکل پیش میاد از این رو اومدم یه کار عجیب انجام دادم و یه آرایه سشن دار تعریف کردم و تک تک ارور هامو تعریف کردم و قبل فایل آپلودم گذاشتم و بعد بررسی کردم آیا ارورهایی که نام برده شده موجوده یا نه اگه نه که هیچی اگه آره فرمو کلاً پردازش نکن

$_SESSION['error'] = array();
		   
		   $_SESSION['error'][] = 0 ;
		  
		   
		   //............................................................................................
		   //This is techinque which i can handle errors before uploading some of files
		   
		   
		   
		   foreach($file_ary as $file){
			   
	              $fname = $file['name'];
				  $fsize = $file['size'] / 1024;
				  $fname_type = strtolower($fname); 
				  $exploded = explode('.',$fname_type);
				  $ftype = end($exploded);
			   
			   
			   if($file['error']>0){
				   
				    
					$_SESSION['error'] = 1; // THERE IS AN ERROR
				   
			   }
			   
			   if (file_exists($updir. $fname)) 
			   {
					$_SESSION['error'] = 2; // FILE EXIST	
						 
			   }
			   if (!in_array($ftype, $allowtype)) 
			   {
				   $_SESSION['error'] = 3; // TYPE DOES NOT SUPPORT
			   }
			   
				   
			   
			   
		   }

می دونم کار غیر منطقیه اما جواب داد در کل اسکریپت شد به این صورت :

 //...............................................................................................
  
  function reArrayFiles(&$file_post) {

	  $file_ary = array();
	  $file_count = count($file_post['name']);
	  $file_keys = array_keys($file_post);
  
	  for ($i=0; $i<$file_count; $i++) {
		  foreach ($file_keys as $key) {
			  $file_ary[$i][$key] = $file_post[$key][$i];
		  }
	  }
  
	  return $file_ary;
  }
//..................................................................................................
       if(isset($_FILES['field_name'])){
		   
		 $_SESSION['Listening'] = "";
		   
// get the name, size (in kb) and type (the extension) of the file......................
	 
	             $file_ary = reArrayFiles($_FILES['field_name']);
				 
				 //Upload Size
			
				 $max_size = 10000000000; 
			   
				 //Upload Directory
			   
				 $updir = ROOTS;
				 
				 // file types allowed
				 
				 $allowtype = array('gif', 'jpg', 'jpeg', 'png' , 'mp3' );
	  //......................................................................................
		   
		   print_r($_FILES['field_name']);
		   
		   
		   $_SESSION['error'] = array();
		   
		   $_SESSION['error'][] = 0 ;
		  
		   
		   //............................................................................................
		   //This is techinque which i can handle errors before uploading some of files
		   
		   
		   
		   foreach($file_ary as $file){
			   
	              $fname = $file['name'];
				  $fsize = $file['size'] / 1024;
				  $fname_type = strtolower($fname); 
				  $exploded = explode('.',$fname_type);
				  $ftype = end($exploded);
			   
			   
			   if($file['error']>0){
				   
				    
					$_SESSION['error'] = 1; // THERE IS AN ERROR
				   
			   }
			   
			   if (file_exists($updir. $fname)) 
			   {
					$_SESSION['error'] = 2; // FILE EXIST	
						 
			   }
			   if (!in_array($ftype, $allowtype)) 
			   {
				   $_SESSION['error'] = 3; // TYPE DOES NOT SUPPORT
			   }
			   
				   
				   
			
			  
			  
			   
			   
		   }
		   //............................................................................................
	   if(isset($_SESSION['error']) && $_SESSION['error']!=1 && $_SESSION['error']!=2 && $_SESSION['error']!=3 )
	   {
		   foreach($file_ary as $file)
		   {
		   
		          $fname = $file['name'];
				  $fsize = $file['size'] / 1024;
				  $fname_type = strtolower($fname); 
				  $exploded = explode('.',$fname_type);
				  $ftype = end($exploded);   
				  
				 
				 //......................................................................................
				 
				 if($file['error']>0)
				 {
					 
					 switch($file['error'])
					 {
						 //Error Translation	
						 //...............................................................................	 
						 case 0 : echo"there is no error" ; break;
						 case 1 : echo"The uploaded file exceeds the upload_max_filesize directive in php.ini."; break;	
						 case 2 : echo"فایلی انتخابی شما حجمش بیش از حد مجاز تعریف شده می باشد."; break;
						 case 3 : echo"فایل ناقص آپلود شده است"; break;
						 case 4 : echo"هیچ فایلی آپلود نشده است!"; break;
						 case 6 : echo"Missing a temporary folder. Introduced in PHP 5.0.3."; break;
						 case 7 : echo"Failed to write file to disk. Introduced in PHP 5.1.0."; break;
						 case 8 : echo"A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.";             break;
					 }
					 
					 
				 }else
				 {
					 
					  
							  
					  // checks if the file already exists
					  if (file_exists($updir. $fname)) 
					  {
							
						  echo'<div class="alert alert-error">';	
						  echo 'THERE IS SUCH  '.$fname.' FILE In DIRECTORY';
						  echo '</div>';
					  }
					  else
					  {
					  
						// if the file not exists, check its type (by extension) and size
						if (in_array($ftype, $allowtype)) 
						{
						  // check the size
						  if ($fsize <= $max_size) 
						  {
							// uses  function to copy the file from temporary folder to $updir
							if (!move_uploaded_file ($file['tmp_name'], $updir. $fname)) 
							{
								
							  echo'<div class="alert alert-error">';
							  echo 'فایل '. $fname. ' موفق به کپی برداری نشده است ، لطفاً مجدد تلاش کنید';
							  echo '</div>';
							}
							else 
							{
							  
							  echo $fname. ' ('. $fsize. ' kb) فایل با موفقیت آپلود شد';
							  print_r( move_uploaded_file ($file['tmp_name'], $updir. $fname));
							  
							  $savedpath = ADDR."repository/".$file['name'];
							  $_SESSION['Listening'][] = $savedpath;
							  
							  
							  
							  
							  
							}
						  }
					   }
					 
					  }
			 
				 }
		  
		     echo "<br>";
		  
		    }
	     }
		 else
		 {
			 
			switch($_SESSION['error']){
				
				case 1: echo "THERE IS AN ERROR"; break;
				case 2: echo "FILE EXIST"; break;
				case 3: echo "TYPE DOES NOT SUPPORT"; break;
				
			}
			 
			 
		 }
		 
		 
		 
		 echo print_r($_SESSION['Listening']);
		   
	   }


الان دیگه مشکلات بالا برطرف شده ، فقط می خوام هر فایلی که آپلود میشه مسیرش داخل دیتابیس توی یه فیلد ذخیره شه اما مشکل اینجاست که چون foreach هر سری یه بار دستور move_uploaded_file انجام میده نمی تونم دستور insert رو بعد این دستور قرار بدم چون id سطر دیتابیس از دستم در میره و اینطوری Insert به هر سطر جدید تزریق میشه . با این حال واسه اینم اومدم یه تکنیک زدم و یه سشن دیگه درست کردم
 $_SESSION['Listening'];
که اینم کارمو راه انداخت .

ببخشید دوستان طول کشید و بابت کثیف کد زدنم هم عذر می خوام ، مطمئنن روش های غیر منطقی است ، لطفاً نظراتتونو بهم بگید

با تشکر
پاسخ
تشکر شده توسط:
#2
روال کاری شما تقریبا درسته فقط من متوجه نشدم دلیل استفاده از سشن چی هست؟ چرا مثلا یک آرایه و متغیر داخلی برای این کار استفاده نکردید؟ دقیقا برتری سشن نسبت به یک متغیر یا آرایه داخلی چیه؟
یا مثلا چرا switch مربوط به ارور رو به صورت تابع جدا در نیوردید؟ کلا خوب نیست دستورات تکراری رو توی foreach قرار بدید
پاسخ
تشکر شده توسط:
#3
(02-06-1394، 09:46 ب.ظ)behtateam نوشته: روال کاری شما تقریبا درسته فقط من متوجه نشدم دلیل استفاده از سشن چی هست؟ چرا مثلا یک آرایه و متغیر داخلی برای این کار استفاده نکردید؟ دقیقا برتری سشن نسبت به یک متغیر یا آرایه داخلی چیه؟
یا مثلا چرا switch مربوط به ارور رو به صورت تابع جدا در نیوردید؟ کلا خوب نیست دستورات تکراری رو توی foreach قرار بدید

مشکل حل شد ، مرسی
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان