个人博客地址https://xgs888.top/post/view?id=57
PHP的sftp文件上传;在框架thinkphp5中使用;
主要用到的sftp函数如下;
ssh3_connect(host,port) 链接信息
ssh3_auth_password($con,username,password)登录验证
copy();//服务器之间的文件复制;
要求如下
需要的文件字段信息见附件内容,注意最后一列带年月日时分秒格式;
上传前,需要先判断相应目录下是否有上一天日期文件夹,若无,则创建,若有,则直接上传至相应文件夹下,如附件所示
thinkphp5中提供了一个非composer安装的第三方类库目录extend
在extend目录下创建一个sftp目录创建sftp.php的类
namespace sftp;
class Sftp
{
// 初始配置为NULL
private $config = NULL;
// 连接为NULL
private $conn = NULL;
//sftp resource
private $ressftp = NULL;
// 初始化
public function __construct($config)
{
$this->config = $config;
$this->connect();
}
public function connect()
{
$this->conn = ssh3_connect($this->config['host'], $this->config['port']);
if( ssh3_auth_password($this->conn, $this->config['username'], $this->config['password']))
{
$this->ressftp = ssh3_sftp($this->conn);
}else{
echo "用户名或密码错误";
}
}
// 下载文件
public function downftp($remote, $local)
{
return copy("ssh3.sftp://{$ressftp}".$remote, $local);
}
// 文件上传
public function upftp( $local,$remote, $file_mode = 0777)
{
return copy($local,"ssh3.sftp://{$this->ressftp}".$remote);
}
//创建目录
public function ssh3_sftp_mchkdir($path) //使用创建目录循环
{
ssh3_sftp_mkdir($this->ressftp, $path,0777);
}
//判段目录是否存在
public function ssh3_dir_exits($dir){
return file_exists("ssh3.sftp://{$this->ressftp}".$dir);
}
}
下面在控制器里面调用
namespace app\index\controller;
use think\Controller;
use \sftp\sftp;
class Index extends Controller
{
public function index()
{
ini_set('max_execution_time','0');//设置永不超时
$time = date('ymd',time()-24*3600);//上一天的日期
$name = "mac".$time;
$data = db('table')->where("add_date='2017-10-09'")->select();//查询数据
$fp = fopen("$name.csv","a"); //打开csv文件,如果不存在则创建
$datastr = 'id,sitecode,devmac,stamac,add_date,up_time'."\r\n";
foreach ($data as $key => $value) {
# code...
$datastr = $datastr.$value['id'].$value['sitecode'].','.$value['devmac'].
','.$value['stamac'].','.$value['add_date'].','.$value['up_time']."\r\n";
}
//iconv('GB2312','UTF-8//IGNORE',$datastr)
fwrite($fp,$datastr); //写入数据讲gbk转成utf8
fclose($fp); //关闭文件句柄
echo "生成成功";
$config = array(
'host'=>'127.0.0.1',
'username'=>'root',
'password'=>'root',
'port'=>'22'
);
$sftp = new sftp($config);
$re = $sftp->ssh3_dir_exits("/test/$time");
if($re){//如果目录存在直接上传
$sftp->upftp("$name.csv",'/test/'.$time.'/'.$name.'.csv');
}else{
$sftp->ssh3_sftp_mchkdir('/test/'.$time);
$sftp->upftp("$name.csv",'/test/'.$time.'/'.$name.'.csv');
}
}
}