zoukankan      html  css  js  c++  java
  • 安装SSH2拓展 PHP上传文件到远程服务器

    情景:客户端上传图片到服务器A,服务器A同步上传至另外一个静态资源服务器B

    环境:php7 linux(ubuntu)

    安装php的ssh2扩展

    sudo apt-get install libssh2-1-dev
    
    sudo  apt-get install php-ssh2

    sudo service apache2 restart

    可在图片上传至服务器A后同步上传至B

    A上传文件至B  函数

     1 //scp上传文件至远程服务 $host为B服务器域名(IP) $user B服务器用户 $password B服务器密码 $local_file为本地文件, $remote_file为远程文件
     2 function scpUploadFile($host,$user,$password,$local_file,$remote_file){
     3     $ssh2 = ssh2_connect($host, 22);  //先登陆SSH并连接
     4     ssh2_auth_password($ssh2,$user,$password);//身份认证  也可以用
     5     //本地传输文件到远程服务器
     6     $stream=ssh2_scp_send($ssh2, $local_file, $remote_file, 0777);
     7     $data =['host'=>$host,'user'=>$user,'pass'=>$password,'lo'=>$local_file,'re'=>$remote_file];
     8 
     9     //默认权限为0644,返回值为bool值,true或false.
    10     return $stream;
    11 }
    

    A从B下载文件 函数

    1 function scpDownloadFile($host,$user,$password,$local_file,$remote_file){
    2     $ssh2 = ssh2_connect($host, 22);
    3     ssh2_auth_password($ssh2,$user,$password);
    4     //从远程服务器下载文件
    5     $stream=ssh2_scp_revc($ssh2, $remote_file, $local_file);
    6     return $stream;
    7 }

    上述连接及身份认证方式 可换为SSH密钥链接 

    1 $ssh2 = ssh2_connect('shell.example.com', 22, array('hostkey'=>'ssh-rsa'));
    2 
    3 if (ssh2_auth_pubkey_file($connection, 'username',
    4                           '/home/username/.ssh/id_rsa.pub',
    5                           '/home/username/.ssh/id_rsa', 'secret')) {
    6   echo "Public Key Authentication Successful
    ";
    7 } else {
    8   die('Public Key Authentication Failed');
    9 }

     

    简单处理客户端多图片上传请求(处理粗糙,可自行完善)

    多图片上传数组处理

     1 function buildImgArray($_FILES){
     2     $i = 0;
     3     foreach ($files as $v){//三维数组转换成2维数组
     4         if(is_string($v['name'])){ //单文件上传
     5             $info[$i] = $v;
     6             $i++;
     7         }else{ // 多文件上传
     8             foreach ($v['name'] as $key=>$val){//2维数组转换成1维数组
     9                 //取出一维数组的值,然后形成另一个数组
    10                 //新的数组的结构为:info=>i=>('name','size'.....)
    11                 $info[$i]['name'] = $v['name'][$key];
    12                 $info[$i]['size'] = $v['size'][$key];
    13                 $info[$i]['type'] = $v['type'][$key];
    14                 $info[$i]['tmp_name'] = $v['tmp_name'][$key];
    15                 $info[$i]['error'] = $v['error'][$key];
    16                 $i++;
    17             }
    18         }
    19     }
    20     return $info;
    21 }

    上传至A并同步上传至B

     1 function uploadFile($files,$host,$user,$password,$maxSize=1048576,$imgFlag=true){
     2     $date = getdate(time());
     3     $year = $date['year'];
     4     $mon = $date['mon'];
     5     $day = $date['mday'];
     6     $path = 'upload/';
     7     if (! is_dir($path)) {
     8         mkdir($path,0777,true);
     9     }
    10     $i = 0;
    11     foreach ($files as $val) {
    12         if ($val['error'] == 0) {
    13             if($val['size']>$maxSize){
    14                 echo "文件太大了";
    15                 return 1;
    16             }
    17             if($imgFlag){
    18                 $result = getimagesize($val['tmp_name']);
    19                 if(!$result){
    20                     echo "您上传的不是一个真正图片";
    21                     return 2;
    22                 }
    23             }
    24             if(!is_uploaded_file($val['tmp_name'])){
    25                 echo "不是通过httppost传输的";
    26                 return 3;
    27             }
    28             $realName = $year.$mon.$day.time().$val['name'];
    29             $destination = $path."/".$realName;
    30             if(move_uploaded_file($val['tmp_name'], $destination)){
    31                 $isUp = scpUploadFile($host,$user,$password,$destination,'/upload/'.$realName);
    32                 if(!$isUp){
    33                     return 4;
    34                 }
    35                 $uploadedFiles[$i]['img']='/upload/'.$realName;
    36                 $i++;
    37             }
    38         }else {
    39             echo '上传失败';
    40             return 5;
    41         }
    42     }
    43     return $uploadedFiles;
    44 }
  • 相关阅读:
    Java安全之JNDI注入
    Visual Studio 2019 升级16.8之后(升级.Net 5),RazorTagHelper任务意外失败
    .Net Core 3.1升级 .Net 5后出现代码错误 rzc generate exited with code 1.
    重走py 之路 ——普通操作与函数(三)
    重走py 之路 ——字典和集合(二)
    设计模式结(完结篇)
    重走py 之路 ——列表(一)
    RestfulApi 学习笔记——分页和排序(五)
    RestfulApi 学习笔记——查询与过滤还有搜索(五)
    Android开发 Error:The number of method references in a .dex file cannot exceed 64K.Android开发 Error:The number of method references in a .dex file cannot exceed 64K
  • 原文地址:https://www.cnblogs.com/yimingwang/p/9852013.html
Copyright © 2011-2022 走看看