2011-01-08 5 views
3

Je suis nouveau dans Zend Framework, et ce code est utilisé pour télécharger des contenus. Ce code fonctionne sur localhost mais quand j'essaye de l'exécuter sur un serveur linux il montre le fichier d'erreur non trouvé.Pourquoi ce code ne fonctionne pas sur le serveur 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); 
      } 
} 

S'il vous plaît aider ...

+0

Avez-vous vérifié les autorisations de fichiers sur le dossier file_upload et tout son contenu? Aussi, vous voudrez peut-être supprimer ce commentaire, car il n'est pas correct: "DOIT se terminer par une barre oblique ("/")" –

+3

Supprimer le @ dans votre fonction fopen (partout en fait), et vous obtiendrez peut-être messages d'erreur qui rendront votre problème évident (comme les permissions de fichiers). – regilero

+0

Merci pour votre réponse, j'ai autorisé. – Manoj

Répondre

1

Les deux questions typiques que je vois souvent entre l'environnement de dev local Windows (XP) et un environnement de production Linux sont:

  1. autorisations de fichier. Linux a généralement un modèle plus restrictif d'autorisations de fichiers.

  2. Sensibilité à la casse des noms de fichiers: les noms de fichiers Linux sont sensibles à la casse. Dans Windows, ils ne le sont pas.

  3. Différent séparateur de répertoire: Windows utilise \, Linux utilise /. La constante PHP DIRECTORY_SEPARATOR contient toujours la bonne valeur pour l'OS (grâce à @Svish).

  4. Différente inclut le séparateur de chemin: Windows utilise ;, Linux utilise :. La constante PHP PATH_SEPARATOR contient toujours la bonne valeur pour le système d'exploitation.

+0

3. Linux utilise ''/'', tandis que Windows utilise '' \ '' comme séparateur de chemin de répertoire. L'utilisation de la constante 'DIRECTORY_SEPARATOR' est donc une bonne idée à mon avis. – Svish

+0

Bon complément. Je vais mettre à jour la réponse pour l'exhaustivité. –

Questions connexes