_error = self::ERROR_EMPTY_HOST; throw new LocalizedException(new Phrase('The specified host is empty. Set the host and try again.')); } if (empty($args['port'])) { $args['port'] = 21; } if (empty($args['user'])) { $args['user'] = 'anonymous'; $args['password'] = 'anonymous@noserver.com'; } if (empty($args['password'])) { $args['password'] = ''; } if (empty($args['timeout'])) { $args['timeout'] = 90; } if (empty($args['file_mode'])) { $args['file_mode'] = FTP_BINARY; } $this->_config = $args; if (empty($this->_config['ssl'])) { $this->_conn = @ftp_connect($this->_config['host'], $this->_config['port'], $this->_config['timeout']); } else { $this->_conn = @ftp_ssl_connect($this->_config['host'], $this->_config['port'], $this->_config['timeout']); } if (!$this->_conn) { $this->_error = self::ERROR_INVALID_CONNECTION; throw new LocalizedException( new Phrase("The FTP connection couldn't be established because of an invalid host or port.") ); } if (!@ftp_login($this->_conn, $this->_config['user'], $this->_config['password'])) { $this->_error = self::ERROR_INVALID_LOGIN; $this->close(); throw new LocalizedException(new Phrase('The username or password is invalid. Verify both and try again.')); } if (!empty($this->_config['path'])) { if (!@ftp_chdir($this->_conn, $this->_config['path'])) { $this->_error = self::ERROR_INVALID_PATH; $this->close(); throw new LocalizedException(new Phrase('The path is invalid. Verify and try again.')); } } if (!empty($this->_config['passive'])) { if (!@ftp_pasv($this->_conn, true)) { $this->_error = self::ERROR_INVALID_MODE; $this->close(); throw new LocalizedException(new Phrase('The file transfer mode is invalid. Verify and try again.')); } } return true; } /** * Close a connection * * @return bool */ public function close() { return @ftp_close($this->_conn); } /** * Create a directory * * @todo implement $mode and $recursive * @param string $dir * @param int $mode * @param bool $recursive * @return bool * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function mkdir($dir, $mode = 0777, $recursive = true) { return @ftp_mkdir($this->_conn, $dir); } /** * Delete a directory * * @param string $dir * @param bool $recursive * @return bool * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function rmdir($dir, $recursive = false) { return @ftp_rmdir($this->_conn, $dir); } /** * Get current working directory * * @return string */ public function pwd() { return @ftp_pwd($this->_conn); } /** * Change current working directory * * @param string $dir * @return bool * @SuppressWarnings(PHPMD.ShortMethodName) */ public function cd($dir) { return @ftp_chdir($this->_conn, $dir); } /** * Read a file to result, file or stream * * @param string $filename * @param string|resource|null $dest destination file name, stream, or if null will return file contents * @return false|string */ public function read($filename, $dest = null) { if (is_string($dest)) { $result = ftp_get($this->_conn, $dest, $filename, $this->_config['file_mode']); } else { if (is_resource($dest)) { $stream = $dest; } elseif ($dest === null) { $stream = tmpfile(); } else { $this->_error = self::ERROR_INVALID_DESTINATION; return false; } $result = ftp_fget($this->_conn, $stream, $filename, $this->_config['file_mode']); if ($dest === null) { fseek($stream, 0); $result = ''; for ($result = ''; $s = fread($stream, 4096); $result .= $s) { } fclose($stream); } } return $result; } /** * Write a file from string, file or stream * * @param string $filename * @param string|resource $src filename, string data or source stream * @param null $mode * @return bool * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function write($filename, $src, $mode = null) { if (is_string($src) && is_readable($src)) { return @ftp_put($this->_conn, $filename, $src, $this->_config['file_mode']); } else { if (is_string($src)) { $stream = tmpfile(); fputs($stream, $src); fseek($stream, 0); } elseif (is_resource($src)) { $stream = $src; } else { $this->_error = self::ERROR_INVALID_SOURCE; return false; } $result = ftp_fput($this->_conn, $filename, $stream, $this->_config['file_mode']); if (is_string($src)) { fclose($stream); } return $result; } } /** * Delete a file * * @param string $filename * @return bool * @SuppressWarnings(PHPMD.ShortMethodName) */ public function rm($filename) { return @ftp_delete($this->_conn, $filename); } /** * Rename or move a directory or a file * * @param string $src * @param string $dest * @return bool * @SuppressWarnings(PHPMD.ShortMethodName) */ public function mv($src, $dest) { return @ftp_rename($this->_conn, $src, $dest); } /** * Change mode of a directory or a file * * @param string $filename * @param int $mode * @return bool */ public function chmod($filename, $mode) { return @ftp_chmod($this->_conn, $mode, $filename); } /** * @param null $grep ignored parameter * @return array * @SuppressWarnings(PHPMD.ShortMethodName) * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function ls($grep = null) { $ls = @ftp_nlist($this->_conn, '.'); $list = []; foreach ($ls as $file) { $list[] = ['text' => $file, 'id' => $this->pwd() . '/' . $file]; } return $list; } /** * @param bool $new * @return string */ protected function _tmpFilename($new = false) { if ($new || !$this->_tmpFilename) { $this->_tmpFilename = tempnam(md5(uniqid(rand(), true)), ''); } return $this->_tmpFilename; } }