2011-01-08 27 views
3

私はZend Frameworkを初めて使用しています。このコードはコンテンツのダウンロードに使用されます。 このコードはlocalhostで動作していますが、Linuxサーバで実行しようとすると エラーファイルが見つかりません。なぜこのコードがLinuxサーバで動作していないのですか?

public function downloadAnnouncementsAction() 
{ 
      $file= $this->_getParam('file'); 
      $file = str_replace("%2F","/",$this->_getParam('file')); 

      // Allow direct file download (hotlinking)? 
      // Empty - allow hotlinking 
      // If set to nonempty value (Example: example.com) will only allow downloads when referrer contains this text 
      define('ALLOWED_REFERRER', ''); 

      // Download folder, i.e. folder where you keep all files for download. 
      // MUST end with slash (i.e. "/") 
      define('BASE_DIR','file_upload'); 

      // log downloads? true/false 
      define('LOG_DOWNLOADS',true); 

      // log file name 
      define('LOG_FILE','downloads.log'); 

      // Allowed extensions list in format 'extension' => 'mime type' 
      // If myme type is set to empty string then script will try to detect mime type 
      // itself, which would only work if you have Mimetype or Fileinfo extensions 
      // installed on server. 
      $allowed_ext = array (  
       // audio 
       'mp3' => 'audio/mpeg', 
       'wav' => 'audio/x-wav', 

       // video 
       'mpeg' => 'video/mpeg', 
       'mpg' => 'video/mpeg', 
       'mpe' => 'video/mpeg', 
       'mov' => 'video/quicktime', 
       'avi' => 'video/x-msvideo' 
      ); 


      // If hotlinking not allowed then make hackers think there are some server problems 
      if (ALLOWED_REFERRER !== '' 
      && (!isset($_SERVER['HTTP_REFERER']) || strpos(strtoupper($_SERVER['HTTP_REFERER']),strtoupper(ALLOWED_REFERRER)) === false) 
      ) { 
       die("Internal server error. Please contact system administrator."); 
      } 

      // Make sure program execution doesn't time out 
      // Set maximum script execution time in seconds (0 means no limit) 
      set_time_limit(0); 

      if (!isset($file) || empty($file)) { 
      die("Please specify file name for download."); 
      } 

      // Nullbyte hack fix 
      if (strpos($file, "\0") !== FALSE) 
        die(''); 

      // Get real file name. 
      // Remove any path info to avoid hacking by adding relative path, etc. 
      $fname = basename($file); 


      // Check if the file exists 
      // Check in subfolders too 
      function find_file ($dirname, $fname, &$file_path) { 

       $dir = opendir($dirname); 

       while ($file = readdir($dir)) { 
       if (empty($file_path) && $file != '.' && $file != '..') { 
        if (is_dir($dirname.'/'.$file)) { 
        find_file($dirname.'/'.$file, $fname, $file_path); 
        } 
        else { 
        if (file_exists($dirname.'/'.$fname)) { 
         $file_path = $dirname.'/'.$fname; 
         return; 
        } 
        } 
       } 
       } 

      } // find_file 

      // get full file path (including subfolders) 
      $file_path = ''; 
      find_file(BASE_DIR, $fname, $file_path); 

      if (!is_file($file_path)) { 
       die("File does not exist. Make sure you specified correct file name."); 
      } 

      // file size in bytes 
      $fsize = filesize($file_path); 

      // file extension 
      $fext = strtolower(substr(strrchr($fname,"."),1)); 

      // check if allowed extension 
      if (!array_key_exists($fext, $allowed_ext)) { 
       die("Not allowed file type."); 
      } 

      // get mime type 
      if ($allowed_ext[$fext] == '') { 
       $mtype = ''; 
       // mime type is not set, get from server settings 
       if (function_exists('mime_content_type')) { 
       $mtype = mime_content_type($file_path); 
       } 
       else if (function_exists('finfo_file')) { 
       $finfo = finfo_open(FILEINFO_MIME); // return mime type 
       $mtype = finfo_file($finfo, $file_path); 
       finfo_close($finfo); 
       } 
       if ($mtype == '') { 
       $mtype = "application/force-download"; 
       } 
      } 
      else { 
       // get mime type defined by admin 
       $mtype = $allowed_ext[$fext]; 
      } 

      // Browser will try to save file with this filename, regardless original filename. 
      // You can override it if needed. 

      if (!isset($_GET['fc']) || empty($_GET['fc'])) { 
       $asfname = $fname; 
      } 
      else { 
       // remove some bad chars 
       $asfname = str_replace(array('"',"'",'\\','/'), '', $_GET['fc']); 
       if ($asfname === '') $asfname = 'NoName'; 
      } 

      // set headers 
      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: $mtype"); 
      header("Content-Disposition: attachment; filename=\"$asfname\""); 
      header("Content-Transfer-Encoding: binary"); 
      header("Content-Length: " . $fsize); 

      // download 

      // @readfile($file_path); 
      $file = @fopen($file_path,"rb"); 
      if ($file) { 
       while(!feof($file)) { 
       print(fread($file, 1024*8)); 
       flush(); 
       if (connection_status()!=0) { 
        @fclose($file); 
        die(); 
       } 
       } 
       @fclose($file); 
      } 

      // log downloads 
      if (!LOG_DOWNLOADS) die(); 

      $f = @fopen(LOG_FILE, 'a+'); 
      if ($f) { 
       @fputs($f, date("m.d.Y g:ia")." ".$_SERVER['REMOTE_ADDR']." ".$fname."\n"); 
       @fclose($f); 
      } 
} 

助けてください...私は、多くの場合、ローカルのWindows(XP)のdevの環境とLinuxの本番環境の間で参照

+0

file_uploadフォルダとそのすべてのコンテンツのファイルアクセス許可を確認しましたか? また、このコメントは正しくないので削除することもできます: "スラッシュ(すなわち"/")で終わらなければならない" –

+3

fopen関数の@を削除すると(おそらくどこでも)、おそらくあなたの問題を明らかにするエラーメッセージ(ファイルパーミッションなど)。 – regilero

+0

あなたの応答に感謝します。私は許可を与えました。 – Manoj

答えて

1

2つの典型的な問題点は以下のとおりです。

  1. ファイルのパーミッション。 Linuxは、通常、より制限的なファイルパーミッションのモデルを持っています。

  2. ファイル名の大文字と小文字の区別:Linuxのファイル名では、大文字と小文字が区別されます。 Windowsでは、そうではありません。

  3. 異なるディレクトリ区切り文字:Windowsは\を使用し、Linuxは/を使用します。 PHP定数DIRECTORY_SEPARATORには常にOSの正しい値が含まれています(@Svishのおかげで)。

  4. 異なるパスを区切る:Windowsは;を使用し、Linuxは:を使用します。 PHP定数PATH_SEPARATORには常にOSの正しい値が含まれています。

+0

3. Linuxは ''/''を使いますが、Windowsは '' \ ''をディレクトリパスの区切り文字として使います。したがって、 'DIRECTORY_SEPARATOR'定数を使用することは私の考えでは良い考えです。 – Svish

+0

良い添加。私は完全性のための答えを更新します。 –

関連する問題