PHP用FTP类上传文件视频等的简单实现方法


Posted in PHP onSeptember 23, 2016

文件1:ftp.php

<?php
/**
 * 仿写CodeIgniter的FTP类
 * FTP基本操作:
 * 1) 登陆; connect
 * 2) 当前目录文件列表; filelist
 * 3) 目录改变; chgdir
 * 4) 重命名/移动; rename
 * 5) 创建文件夹; mkdir
 * 6) 删除; delete_dir/delete_file
 * 7) 上传; upload
 * 8) 下载 download
 *
 * @author quanshuidingdang
 */
class Ftp {


private $hostname
= '';
private $username
= '';
private $password
= '';
private $port 
= 21;
private $passive 
= TRUE;
private $debug
= TRUE;
private $conn_id 
= FALSE;

/**
* 构造函数
*
* @param array 配置数组 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...);
*/
public function __construct($config = array()) {
if(count($config) > 0) {
$this->_init($config);
}
}

/**
* FTP连接
*
* @access public
* @param array 配置数组
* @return boolean
*/
public function connect($config = array()) {
if(count($config) > 0) {
$this->_init($config);
}
//判断是否打开了ftp连接
if(FALSE === ($this->conn_id = @ftp_connect($this->hostname,$this->port))) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_connect");
}
return FALSE;
}
//判断是否登录成功
if( ! $this->_login()) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_login");
}
return FALSE;
}
//判断是否开启FTP被动模式
if($this->passive === TRUE) {
ftp_pasv($this->conn_id, TRUE);
}

return TRUE;
}



/**
* 目录改变
*
* @access public
* @param string 目录标识(ftp)
* @param boolean 
* @return boolean
*/
public function chgdir($path = '', $supress_debug = FALSE) {
if($path == '' OR ! $this->_isconn()) {
return FALSE;
}

$result = @ftp_chdir($this->conn_id, $path);

if($result === FALSE) {
if($this->debug === TRUE AND $supress_debug == FALSE) {
$this->_error("ftp_unable_to_chgdir:dir[".$path."]");
}
return FALSE;
}

return TRUE;
}

/**
* 目录生成
*
* @access public
* @param string 目录标识(ftp)
* @param int  文件权限列表 
* @return boolean
*/
public function mkdir($path = '', $permissions = NULL) {
if($path == '' OR ! $this->_isconn()) {
return FALSE;
}

$result = @ftp_mkdir($this->conn_id, $path);

if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_mkdir:dir[".$path."]");
}
return FALSE;
}

if( ! is_null($permissions)) {
$this->chmod($path,(int)$permissions);
}

return TRUE;
}

/**
* 上传
*
* @access public
* @param string 本地目录标识
* @param string 远程目录标识(ftp)
* @param string 上传模式 auto || ascii
* @param int 上传后的文件权限列表

* @return boolean
*/
public function upload($localpath, $remotepath, $mode = 'auto', $permissions = NULL) {
if( ! $this->_isconn()) {
return FALSE;
}
//判断本地文件是否存在
if( ! file_exists($localpath)) {
if($this->debug === TRUE) {
$this->_error("ftp_no_source_file:".$localpath);
}
return FALSE;
}
//判断上传模式
if($mode == 'auto') {
      //获取文件后缀类型
$ext = $this->_getext($localpath);
      //根据后缀类型决定上传模式是 FTP_ASCII(文本模式) 还是 FTP_BINARY(二进制模式);
$mode = $this->_settype($ext);
}

$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
//上传
$result = @ftp_put($this->conn_id, $remotepath, $localpath, $mode);
//判断上传是否成功
if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_upload:localpath[".$localpath."]/remotepath[".$remotepath."]");
}
return FALSE;
}
//判断是否需要改写文件权限
if( ! is_null($permissions)) {
$this->chmod($remotepath,(int)$permissions);
}

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;
}

if($mode == 'auto') {
$ext = $this->_getext($remotepath);
$mode = $this->_settype($ext);
}

$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)
* @param string 新目录标识
* @param boolean 判断是重命名(FALSE)还是移动(TRUE)

* @return boolean
*/
public function rename($oldname, $newname, $move = FALSE) {
if( ! $this->_isconn()) {
return FALSE;
}

$result = @ftp_rename($this->conn_id, $oldname, $newname);

if($result === FALSE) {
if($this->debug === TRUE) {
$msg = ($move == FALSE) ? "ftp_unable_to_rename" : "ftp_unable_to_move";
$this->_error($msg);
}
return FALSE;
}

return TRUE;
}

/**
* 删除文件
*
* @access public
* @param string 文件标识(ftp)
* @return boolean
*/
public function delete_file($file) {
if( ! $this->_isconn()) {
return FALSE;
}

$result = @ftp_delete($this->conn_id, $file);

if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_delete_file:file[".$file."]");
}
return FALSE;
}

return TRUE;
}

/**
* 删除文件夹
*
* @access public
* @param string 目录标识(ftp)
* @return boolean
*/
public function delete_dir($path) {
if( ! $this->_isconn()) {
return FALSE;
}

//对目录宏的'/'字符添加反斜杠'\'
$path = preg_replace("/(.+?)\/*$/", "\\1/", $path);

//获取目录文件列表
$filelist = $this->filelist($path);

if($filelist !== FALSE AND count($filelist) > 0) {
foreach($filelist as $item) {
//如果我们无法删除,那么就可能是一个文件夹
//所以我们递归调用delete_dir()
if( ! @delete_file($item)) {
$this->delete_dir($item);
}
}
}

//删除文件夹(空文件夹)
$result = @ftp_rmdir($this->conn_id, $path);

if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_delete_dir:dir[".$path."]");
}
return FALSE;
}

return TRUE;
}

/**
* 修改文件权限
*
* @access public
* @param string 目录标识(ftp)
* @return boolean
*/
public function chmod($path, $perm) {
if( ! $this->_isconn()) {
return FALSE;
}

//只有在PHP5中才定义了修改权限的函数(ftp)
if( ! function_exists('ftp_chmod')) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_chmod(function)");
}
return FALSE;
}

$result = @ftp_chmod($this->conn_id, $perm, $path);

if($result === FALSE) {
if($this->debug === TRUE) {
$this->_error("ftp_unable_to_chmod:path[".$path."]-chmod[".$perm."]");
}
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
*
* @access public
* @return boolean
*/
public function close() {
if( ! $this->_isconn()) {
return FALSE;
}

return @ftp_close($this->conn_id);
}

/**
* FTP成员变量初始化
*
* @access private
* @param array 配置数组  
* @return void
*/
private function _init($config = array()) {
foreach($config as $key => $val) {
if(isset($this->$key)) {
$this->$key = $val;
}
}


//特殊字符过滤
$this->hostname = preg_replace('|.+?://|','',$this->hostname);
}

/**
* FTP登陆
*
* @access private
* @return boolean
*/
private function _login() {
return @ftp_login($this->conn_id, $this->username, $this->password);
}

/**
* 判断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 private
* @param string 目录标识
* @return string
*/
private function _getext($filename) {
if(FALSE === strpos($filename, '.')) {
return 'txt';
}

$extarr = explode('.', $filename);
return end($extarr);
}

/**
* 从后缀扩展定义FTP传输模式 ascii 或 binary
*
* @access private
* @param string 后缀扩展
* @return string
*/
private function _settype($ext) {
$text_type = array (
'txt',
'text',
'php',
'phps',
'php4',
'js',
'css',
'htm',
'html',
'phtml',
'shtml',
'log',
'xml'
);

return (in_array($ext, $text_type)) ? 'ascii' : 'binary';
}

/**
* 错误日志记录
*
* @access prvate
* @return boolean
*/
private function _error($msg) {
return @file_put_contents('ftp_err.log', "date[".date("Y-m-d H:i:s")."]-hostname[".$this->hostname."]-username[".$this->username."]-password[".$this->password."]-msg[".$msg."]\n", FILE_APPEND);
}
}


/*End of file ftp.php*/
/*Location /Apache Group/htdocs/ftp.php*/

 文件2:ftp_demo.php

<?php
require_once('ftp.php');


$config = array(
'hostname' => '101.64.183.92', //服务器地址
'username' => 'ftpadminuser',  //FTP登录账号
'password' => 'admin_user',   //FTP登录密码
'port' => 2112         //端口号
);


$ftp = new Ftp();
//连接
$ftp->connect($config);
//上传第一个参数是本地文件名,第二个参数是FTP文件名
$rs=$ftp->upload('jsyh.flv','jsyh.flv');
if($rs){
  echo 1;
}
// $ftp->download('ftp_upload.log','ftp_download.log');

以上就是小编为大家带来的PHP用FTP类上传文件视频等的简单实现方法的全部内容了,希望对大家有所帮助,多多支持三水点靠木~

PHP 相关文章推荐
PHP生成静态页面详解
Nov 19 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
Jun 06 PHP
PHP获取数组中重复最多的元素的实现方法
Nov 11 PHP
PHP里的单例类写法实例
Jun 25 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
PHP云打印类完整示例
Oct 15 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 #PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 #PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 #PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 #PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 #PHP
php的api数据接口书写实例(推荐)
Sep 22 #PHP
thinkphp跨库操作的简单代码实例
Sep 22 #PHP
You might like
PHP 函数执行效率的小比较
2010/10/17 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
js常用排序实现代码
2010/12/28 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
最简单的tab切换实例代码
2016/05/13 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
python中dict()的高级用法实现
2019/11/13 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
会计找工作求职信范文
2013/12/09 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
服务质量承诺书
2014/03/27 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
服务标兵事迹材料
2014/05/04 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python