توابع آماده پی اچ پی برای تشخیص فرمت فایل

phpweb

Active Member
من می خوام یه اسکریپت دانلود فایل بنویسم.

همونطور که می دونید برای اینکار باید از هدرها استفاده کرد و فرمت فایل رو به مرورگر اعلام کرد.

من با این بخش مشکل دارم و نمی دونم چطور باید فرمت فایل رو تشخیص بدم و از طریق هدرها، فرمت فایل رو به مرورگر اعلام کنم.

لطفا راهنمایی کنید.
 

phpweb

Active Member
با explode می تونید تشخیص بدید

با این تابع فقط می تونیم پسوند فایل رو بدست آورد.

من می خوام فرمت فایل رو بدست بیارم و بعد از طریق ارسال هدر، فرمت فایل رو به مرورگر اعلام کنم.

تابع اکسپلود برای این کار مناسب نیست. مثلا نمی تونه فرمت text/plain- text/html- audio/mpeg- [FONT=&quot]application/x-shockwave-flash و سایر فرمتهای متدوال رو تشخیص بده.

سایر دوستان در این مورد نظری ندارن؟

[/FONT]
 
آخرین ویرایش:

ARMIN3D.NET

New Member
فانکشن کامل دانلود :

PHP:
function Download($file)
{
if (!is_file($file))
{ 
die("<b>404 File not found!</b>")  ;
} 
$len          = filesize  ($file)  ;
$filename     = basename  ($file)  ;
$file_extension = strtolower(substr(strrchr($filename,"."),1))    ;
switch                      ( $file_extension )
{
      case "pdf" : $ctype="application/pdf"               ; break ;
      case "exe" : $ctype="application/octet-stream"      ; break ;
      case "zip" : $ctype="application/zip"               ; break ;
      case "doc" : $ctype="application/msword"            ; break ;
      case "xls" : $ctype="application/vnd.ms-excel"      ; break ;
      case "ppt" : $ctype="application/vnd.ms-powerpoint" ; break ;
      case "gif" : $ctype="image/gif"                     ; break ;
      case "png" : $ctype="image/png"                     ; break ;
      case "jpeg":
      case "jpg" : $ctype="image/jpg"                     ; break ;
      case "mp3" : $ctype="audio/mpeg"                    ; break ;
      case "wav" : $ctype="audio/x-wav"                   ; break ;
      case "mpeg":
      case "mpg" :
      case "mpe" : $ctype="video/mpeg"                    ; break ;
      case "mov" : $ctype="video/quicktime"               ; break ;
      case "avi" : $ctype="video/x-msvideo"               ; break ;
      case "php" :
      case "htm" :
      case "html":
      case "txt" : die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

      default    : $ctype="application/force-download"    ;
}
 header  ( "Pragma: public"                                           ) ;
 header  ( "Expires: 0"                                               ) ;
 header  ( "Cache-Control: must-revalidate, post-check=0, pre-check=0") ;
 header  ( "Cache-Control: public"                                    ) ; 
 header  ( "Content-Description: File Transfer"                       ) ;
 header  ( "Content-Type: $ctype"                                     ) ;
 $header = "Content-Disposition: attachment; filename=".$filename.";"   ;
 header  ( $header                                                    ) ;
 header  ( "Content-Transfer-Encoding: binary"                        ) ;
 header  ( "Content-Length: ".$len                                    ) ;
@readfile( $file                                                      ) ;
    exit; 
}
if      (isset($_GET['DLid']    ))
{ 
$dlid =  (int) $_GET['DLid']     ;
if      (isset($_SESSION['user']))
{
$file = $_SERVER['DOCUMENT_ROOT'].'/DLfiles/'.$esmeshoazDBbegir;     
Download($file);
}else
{     
echo 'اجازه دسترسی برای شما صادر نشده است';
}
}

این هم برای htaccess :

PHP:
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^userfile/([0-9]+).zip$ download.php?DLid=$1


</IfModule
 

phpweb

Active Member
فانکشن کامل دانلود :

PHP:
function Download($file)
{
if (!is_file($file))
{ 
die("<b>404 File not found!</b>")  ;
} 
$len          = filesize  ($file)  ;
$filename     = basename  ($file)  ;
$file_extension = strtolower(substr(strrchr($filename,"."),1))    ;
switch                      ( $file_extension )
{
      case "pdf" : $ctype="application/pdf"               ; break ;
      case "exe" : $ctype="application/octet-stream"      ; break ;
      case "zip" : $ctype="application/zip"               ; break ;
      case "doc" : $ctype="application/msword"            ; break ;
      case "xls" : $ctype="application/vnd.ms-excel"      ; break ;
      case "ppt" : $ctype="application/vnd.ms-powerpoint" ; break ;
      case "gif" : $ctype="image/gif"                     ; break ;
      case "png" : $ctype="image/png"                     ; break ;
      case "jpeg":
      case "jpg" : $ctype="image/jpg"                     ; break ;
      case "mp3" : $ctype="audio/mpeg"                    ; break ;
      case "wav" : $ctype="audio/x-wav"                   ; break ;
      case "mpeg":
      case "mpg" :
      case "mpe" : $ctype="video/mpeg"                    ; break ;
      case "mov" : $ctype="video/quicktime"               ; break ;
      case "avi" : $ctype="video/x-msvideo"               ; break ;
      case "php" :
      case "htm" :
      case "html":
      case "txt" : die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

      default    : $ctype="application/force-download"    ;
}
 header  ( "Pragma: public"                                           ) ;
 header  ( "Expires: 0"                                               ) ;
 header  ( "Cache-Control: must-revalidate, post-check=0, pre-check=0") ;
 header  ( "Cache-Control: public"                                    ) ; 
 header  ( "Content-Description: File Transfer"                       ) ;
 header  ( "Content-Type: $ctype"                                     ) ;
 $header = "Content-Disposition: attachment; filename=".$filename.";"   ;
 header  ( $header                                                    ) ;
 header  ( "Content-Transfer-Encoding: binary"                        ) ;
 header  ( "Content-Length: ".$len                                    ) ;
@readfile( $file                                                      ) ;
    exit; 
}
if      (isset($_GET['DLid']    ))
{ 
$dlid =  (int) $_GET['DLid']     ;
if      (isset($_SESSION['user']))
{
$file = $_SERVER['DOCUMENT_ROOT'].'/DLfiles/'.$esmeshoazDBbegir;     
Download($file);
}else
{     
echo 'اجازه دسترسی برای شما صادر نشده است';
}
}

این هم برای htaccess :

PHP:
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteRule ^userfile/([0-9]+).zip$ download.php?DLid=$1


</IfModule

لطفا یه توضیح در مورد این بخش از کد بدید:
PHP:
      case "php" :
      case "htm" :
      case "html":
      case "txt" : die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

      default    : $ctype="application/force-download"    ;

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

اگه یه منبع فارسی برای معرفی هدرها سراغ دارید، لینکش رو برام ارسال کنید.
 

ARMIN3D.NET

New Member
قسمتی که شما Q کردین ، یه فیچر امنیتی هست. یوزر شما که نباید بتونه فایل های اسکریپت شما رو دانلود بکنه.
قسمت default هم برای موقعی کاربرد داره که MIME فایل شما ، یکی از کیس های بالا نباشه.
پارامتر default برای دستور switch ، تمامی کیس ها رو بررسی میکنه و اگر condition شما جز کیس ها نباشه از default استفاده میکنه.
 

phpweb

Active Member
قسمتی که شما q کردین ، یه فیچر امنیتی هست. یوزر شما که نباید بتونه فایل های اسکریپت شما رو دانلود بکنه.
قسمت default هم برای موقعی کاربرد داره که mime فایل شما ، یکی از کیس های بالا نباشه.
پارامتر default برای دستور switch ، تمامی کیس ها رو بررسی میکنه و اگر condition شما جز کیس ها نباشه از default استفاده میکنه.

خب اگه من بخوام فایلهایی با پسوند پی اچ پی یا تکست رو برای دانلود قرار بدم، تابع جلوی دانلود شدن فایل رو می گیره و کاربر نمی تونه این فایلهای مجاز رو رو دانلود کنه.

در این شرایط چیکار باید کرد؟
 

جدیدترین ارسال ها

بالا