/**
 * Get a file from a remote FTP server.
 *
 * @param string $filename
 * @return mixed false in case a error happens, other wise the local filename
 */
function ftp_get_file(&$filename)
{
    global $user, $phpbb_root_path;
    $user->add_lang('mods/ftp_attach');
    if (!file_exists($phpbb_root_path . 'store/' . $filename)) {
        $object = array('error' => array());
        $transfer = ftp_object($object);
        if (!$transfer || sizeof($object['error'])) {
            trigger_error(implode('<br />', $object['error']));
            return false;
        }
        if (!ftp_file_exists($filename, $transfer)) {
            trigger_error($user->lang['ERROR_NO_ATTACHMENT'] . '<br /><br />' . sprintf($user->lang['FILE_NOT_FOUND_404'], $filename));
        }
        $transfer->download_file($phpbb_root_path . 'store/' . $filename, $filename);
    }
    $filename = $phpbb_root_path . 'store/' . $filename;
    return $filename;
}
function ftp_fput($sock, $remotefile, $fp, $mode = 1)
{
    if ($mode) {
        $type = "I";
    } else {
        $type = "A";
    }
    ftp_putcmd($sock, "PASV");
    $string = ftp_getresp($sock);
    ftp_putcmd($sock, "TYPE", $type);
    ftp_getresp($sock);
    if (ftp_file_exists($sock, $remotefile)) {
        ftp_debug("Warning : Remote file will be overwritten\n");
    }
    ftp_putcmd($sock, "STOR", $remotefile);
    $sock_data = ftp_open_data_connection($string);
    if (!$sock_data) {
        return FALSE;
    }
    if (ftp_ok($sock)) {
        ftp_debug("Connected to remote host\n");
    } else {
        ftp_debug("Cannot connect to remote host\n");
        ftp_debug("Error : PUT failed\n");
        return FALSE;
    }
    ftp_debug("Storing local file \"" . $localfile . "\" to remote file \"" . $remotefile . "\"\n");
    while (!feof($fp)) {
        fputs($sock_data, fread($fp, 4096));
    }
    ftp_close_data_connection($sock_data);
    return ftp_ok($sock);
}
Example #3
0
 /**
  * Enregistre le fichier envoyé dans un dossier sur un serveur FTP
  *
  * @param resource $ftp_stream       -> La ressource de connexion FTP
  * @param string   $uploadDirectory  -> Le chemin du dossier de destination
  * @param bool     $replaceOldFile   -> Remplacement des anciens fichiers qui ont le même nom ? Non par défaut
  * @param function $filenameFunction -> La fonction de traitement du filename
  * @return array('success' => true) ou array('error' => 'error message')
  */
 public function handleUploadFTP($ftp_stream, $uploadDirectory, $replaceOldFile = false, $filenameFunction = null)
 {
     // Si on peut écrire dans le dossier de destination
     if (!@ftp_chdir($ftp_stream, $uploadDirectory)) {
         return array('error' => Utils::t('Server error. The upload destination folder isn\'t writable.'));
     }
     // Si il y a bien un fichier envoyé
     if (!$this->file) {
         return array('error' => Utils::t('No file was uploaded'));
     }
     // Récuperation de la taille du fichier et test si il n'est pas vide ou supérieur à la taille configurée
     $size = $this->file->getSize();
     if ($size === 0) {
         return array('error' => Utils::t('The file is empty.'));
     }
     if ($size > $this->sizeLimit) {
         return array('error' => Utils::t('The file size is too large.'));
     }
     // Récuperation du nom et de l'extension du fichier pour tester si l'extension est valide et si le nom du fichier n'existe pas déjà
     $pathinfo = pathinfo($this->file->getName());
     if ($filenameFunction != null) {
         $filename = $filenameFunction($pathinfo['filename']);
     } else {
         $filename = $pathinfo['filename'];
     }
     $ext = $pathinfo['extension'];
     if ($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)) {
         $these = implode(', ', $this->allowedExtensions);
         return array('error' => Utils::t('The file has invalid extension (allowed extensions:') . ' ' . $these . ').');
     }
     // Si il ne faut pas remplacer les anciens fichiers
     if (!$replaceOldFile) {
         // Fonction pour vérifier si le fichier existe sur le FTP
         function ftp_file_exists($ftp_stream, $uploadDirectory, $filename)
         {
             $files = ftp_nlist($ftp_stream, $uploadDirectory);
             if (count($files) > 0) {
                 foreach ($files as $file) {
                     if ($uploadDirectory . $filename == $file) {
                         return true;
                     }
                 }
             }
             return false;
         }
         // Pour chaque fichier, on test si il existe, si oui, on rajoute un nombre aléatoire de 10 à 99
         while (ftp_file_exists($ftp_stream, $uploadDirectory, $filename . '.' . $ext)) {
             $filename .= rand(10, 99);
         }
     }
     // Enregistrement du fichier
     if ($this->file->saveFTP($ftp_stream, $uploadDirectory, $filename . '.' . $ext)) {
         return array('success' => true);
     } else {
         return array('error' => Utils::t('The file was not uploaded. Upload has been cancelled or a server error occurred.'));
     }
 }
Example #4
0
 /**
  * Enregistre le fichier envoyé dans un dossier sur un serveur FTP
  *
  * @param resource $ftp_stream        -> La ressource de connexion FTP
  * @param string   $uploadDirectory   -> Le chemin du dossier de destination
  * @param bool     $replaceOldFile    -> Remplacement des anciens fichiers qui ont le même nom ? Non par défaut
  * @param function $filename_function -> La fonction de traitement du filename
  * @return array('success' => true) ou array('error' => 'error message')
  */
 public function handleUploadFTP($ftp_stream, $uploadDirectory, $replaceOldFile = false, $filename_function = null)
 {
     // Si on peut écrire dans le dossier de destination
     if (!@ftp_chdir($ftp_stream, $uploadDirectory)) {
         return array('error' => 'Erreur du serveur. Le dossier de destination des uploads n\'est pas écrivable.');
     }
     // Si il y a bien un fichier envoyé
     if (!$this->file) {
         return array('error' => 'Aucun fichier n\'a été uploadé.');
     }
     // Récuperation de la taille du fichier et test si il n'est pas vide ou supérieur à la taille configurée
     $size = $this->file->getSize();
     if ($size === 0) {
         return array('error' => 'Le fichier est vide.');
     }
     if ($size > $this->sizeLimit) {
         return array('error' => 'La taille du fichier est supérieur à la limite autorisé.');
     }
     // Récuperation du nom et de l'extension du fichier pour tester si l'extension est valide et si le nom du fichier n'existe pas déjà
     $pathinfo = pathinfo($this->file->getName());
     if ($filename_function != null) {
         $filename = $filename_function($pathinfo['filename']);
     } else {
         $filename = $pathinfo['filename'];
     }
     $ext = $pathinfo['extension'];
     if ($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)) {
         $these = implode(', ', $this->allowedExtensions);
         return array('error' => 'L\'extension du fichier est invalide (extension autorisées : ' . $these . ').');
     }
     // Si il ne faut pas remplacer les anciens fichiers
     if (!$replaceOldFile) {
         // Fonction pour vérifier si le fichier existe sur le FTP
         function ftp_file_exists($ftp_stream, $uploadDirectory, $filename)
         {
             $files = ftp_nlist($ftp_stream, $uploadDirectory);
             if (count($files) > 0) {
                 foreach ($files as $file) {
                     if ($uploadDirectory . $filename == $file) {
                         return true;
                     }
                 }
             }
             return false;
         }
         // Pour chaque fichier, on test si il existe, si oui, on rajoute un nombre aléatoire de 10 à 99
         while (ftp_file_exists($ftp_stream, $uploadDirectory, $filename . '.' . $ext)) {
             $filename .= rand(10, 99);
         }
     }
     // Enregistrement du fichier
     if ($this->file->saveFTP($ftp_stream, $uploadDirectory, $filename . '.' . $ext)) {
         return array('success' => true);
     } else {
         return array('error' => 'Le fichier n\'a pas été envoyé. L\'envoi a été annulé ou une erreur du serveur est survenue.');
     }
 }