• 安装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 }
  • 相关阅读:
    金步国作品列表
    GCC编译优化指南【作者:金步国】
    g++优化选项
    C++中实现对map按照value值进行排序
    C++ STL中Map的相关排序操作:按Key排序和按Value排序
    How-To: add EPEL repository to Centos 6.x is Easy!
    如何为linux释放内存和缓存
    用Python对体积较大的CSV文件进行比较的经验
    The mmap module
    Python逐块读取大文件行数的代码
  • 原文地址:https://www.cnblogs.com/yimingwang/p/9852013.html
Copyright © 2020-2023  润新知