如何獲取Ftp服務器上的文件
- 可以通過賬號密碼,使用Xftp進行鏈接
XFtp連接
- 通過代碼獲取,本文主要是通過php代碼獲取Ftp上的文件,并且去重。
private $hostname = ''; \地址
private $username = '';
private $password = '';
private $port = 21;
private $conn_id = FALSE;
/**
* FTP登陸
*
* @access private
* @return boolean
*/
private function _login()
{
return @ftp_login($this->conn_id, $this->username, $this->password);
}
/**
* 關閉FTP
*
* @access public
* @return boolean
*/
public function close()
{
if (!$this->_isconn()) {
return FALSE;
}
return @ftp_close($this->conn_id);
}
/**
* 判斷con_id
*
* @access private
* @return boolean
*/
private function _isconn()
{
if (!is_resource($this->conn_id)) {
if ($this->debug === TRUE) {
$this->_error("ftp_no_connection");
}
return FALSE;
}
return TRUE;
}
/**
* 下載
*
* @access public
* @param string 遠程目錄標識(ftp)
* @param string 本地目錄標識
* @param string 下載模式 auto || ascii
* @return boolean
*/
public function download($remotepath, $localpath, $mode = 'auto')
{
if (!$this->_isconn()) {
return FALSE;
}
$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
$result = @ftp_get($this->conn_id, $localpath, $remotepath, $mode);
if ($result === FALSE) {
if ($this->debug === TRUE) {
$this->_error("ftp_unable_to_download:localpath[" . $localpath . "]-remotepath[" . $remotepath . "]");
}
return FALSE;
}
return TRUE;
}
/**
* 獲取目錄文件列表
*
* @access public
* @param string 目錄標識(ftp)
* @return array
*/
public function filelist($path = '.')
{
if (!$this->_isconn()) {
return FALSE;
}
return ftp_nlist($this->conn_id, $path);
}
以上是ftp一些基礎操作,連接,獲取文件列表,下載文件,需要獲取代碼可以私信我獲取,
接下來需要進行獲取文件操作,并且去除重復的
- 獲取本地文件
- 獲取遠程文件
- 對比本地沒有的文件并且下載
- 對下載的文件進行相關操作
/**
* 獲取遠程文件列表
*/
private function getRemoteFileList($path, $config)
{
$this->ftp = new Ftp($config);
$res = $this->ftp->connect($config);
if ($res) {
$fileArr = array();
$list = $this->listFtpDir($path, $fileArr);
$this->ftp->close();
return $list;
}
return false;
}
private function listFtpDir($dir, &$fileArr)
{
$data = $this->ftp->filelist($dir);
if (!is_array($data)) {
return;
}
foreach ($data as $value) {
if ($this->is_json_file($value)) {
$fileArr[] = $value;
} else {
$this->listFtpDir($value, $fileArr);
}
}
return $fileArr;
}
public function file($dataDir)
{
//獲取本地文件列表
$localFileList = $this->getBrLocalFileList($dataDir, 'FLIE/');
if (count($localFileList) > 0) {
foreach ($localFileList as $key => $value) {
$localFileList[$key] = str_replace(self::FTP_FILE_DIR, '', $value);
}
}
//獲取遠程文件列表
$remoteFileList = $this->getBrRemoteFileList($dataDir, 'FLIE');
//獲取本地沒有的文件列表
$remoteArr = array();
if (count($localFileList) > 0) {
foreach ($remoteFileList as $key => $value) {
if (!in_array($value, $localFileList)) {
$remoteArr[] = $value;
}
}
} else {
$remoteArr = $remoteFileList;
}
//下載文件,對于本地有的不會進行二次下載,上面方法已經過濾
然后對文件需要的操作,
}
/**
* 下載遠程文件
*/
private function downRemote2LocalWget($localFtpDir, $list, $config)
{
$this->ftp = new ftp($config);
$this->ftp->connect();
foreach ($list as $value) {
$dir = $localFtpDir . '/' . substr($value, 0, strripos($value, '/'));
if (!is_dir($dir)) mkdir($dir, 0777, true);
//本地存在則刪除
if (is_file($localFtpDir . '/' . $value)) {
unlink($localFtpDir . '/' . $value);
}
if (!is_file($localFtpDir . '/' . $value)) {
$filesize = $this->ftp->ftpfilesize($value);
if (!$filesize) {
echo '服務端文件為空!' . "n";
} else {
$re = $this->ftp->download($value, $dir . '/' . substr($value, strripos($value, '/') + 1, strlen($value) - 1));
if ($re) {
echo '下載' . $value . '成功!' . "n";
} else {
echo '下載' . $value . '失敗!' . "n";
}
}
}
}
$this->ftp->close();
}
上面是FTP下載文件一些基本操作,只貼了部分代碼。如有出入,可以后臺聯系我,歡迎指正。