/** * 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); }
/** * 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.')); } }
/** * 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.'); } }