情景:客戶端上傳圖片到服務(wù)器A,服務(wù)器A同步上傳至另外一個(gè)靜態(tài)資源服務(wù)器B
環(huán)境:php7 linux(ubuntu)
安裝php的ssh2擴(kuò)展
sudo apt-get install libssh2-1-dev
sudo apt-get install php-ssh2
sudo service apache2 restart
可在圖片上傳至服務(wù)器A后同步上傳至B
A上傳文件至B 函數(shù)
//scp上傳文件至遠(yuǎn)程服務(wù) $host為B服務(wù)器域名(IP) $user B服務(wù)器用戶 $password B服務(wù)器密碼 $local_file為本地文件点寥, $remote_file為遠(yuǎn)程文件
function scpUploadFile($host,$user,$password,$local_file,$remote_file){
$ssh2 = ssh2_connect($host, 22); //先登陸SSH并連接
ssh2_auth_password($ssh2,$user,$password);//身份認(rèn)證 也可以用
//本地傳輸文件到遠(yuǎn)程服務(wù)器
$stream=ssh2_scp_send($ssh2, $local_file, $remote_file, 0777);
$data =['host'=>$host,'user'=>$user,'pass'=>$password,'lo'=>$local_file,'re'=>$remote_file];
//默認(rèn)權(quán)限為0644,返回值為bool值裁奇,true或false.
return $stream;
}
A從B下載文件 函數(shù)
function scpDownloadFile($host,$user,$password,$local_file,$remote_file){
2 $ssh2 = ssh2_connect($host, 22);
3 ssh2_auth_password($ssh2,$user,$password);
4 //從遠(yuǎn)程服務(wù)器下載文件
5 $stream=ssh2_scp_revc($ssh2, $remote_file, $local_file);
6 return $stream;
7 }
上述連接及身份認(rèn)證方式 可換為SSH密鑰鏈接
$ssh2 = ssh2_connect('shell.example.com', 22, array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection, 'username',
'/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret')) {
echo "Public Key Authentication Successful\n";
} else {
die('Public Key Authentication Failed');
}
簡(jiǎn)單處理客戶端多圖片上傳請(qǐng)求(處理粗糙,可自行完善)
多圖片上傳數(shù)組處理
function buildImgArray($_FILES){
$i = 0;
foreach ($files as $v){//三維數(shù)組轉(zhuǎn)換成2維數(shù)組
if(is_string($v['name'])){ //單文件上傳
$info[$i] = $v;
$i++;
}else{ // 多文件上傳
foreach ($v['name'] as $key=>$val){//2維數(shù)組轉(zhuǎn)換成1維數(shù)組
//取出一維數(shù)組的值队秩,然后形成另一個(gè)數(shù)組
//新的數(shù)組的結(jié)構(gòu)為:info=>i=>('name','size'.....)
$info[$i]['name'] = $v['name'][$key];
$info[$i]['size'] = $v['size'][$key];
$info[$i]['type'] = $v['type'][$key];
$info[$i]['tmp_name'] = $v['tmp_name'][$key];
$info[$i]['error'] = $v['error'][$key];
$i++;
}
}
}
return $info;
}
上傳至A并同步上傳至B
function uploadFile($files,$host,$user,$password,$maxSize=1048576,$imgFlag=true){
$date = getdate(time());
$year = $date['year'];
$mon = $date['mon'];
$day = $date['mday'];
$path = 'upload/';
if (! is_dir($path)) {
mkdir($path,0777,true);
}
$i = 0;
foreach ($files as $val) {
if ($val['error'] == 0) {
if($val['size']>$maxSize){
echo "文件太大了";
return 1;
}
if($imgFlag){
$result = getimagesize($val['tmp_name']);
if(!$result){
echo "您上傳的不是一個(gè)真正圖片";
return 2;
}
}
if(!is_uploaded_file($val['tmp_name'])){
echo "不是通過(guò)httppost傳輸?shù)?;
return 3;
}
$realName = $year.$mon.$day.time().$val['name'];
$destination = $path."/".$realName;
if(move_uploaded_file($val['tmp_name'], $destination)){
$isUp = scpUploadFile($host,$user,$password,$destination,'/upload/'.$realName);
if(!$isUp){
return 4;
}
$uploadedFiles[$i]['img']='/upload/'.$realName;
$i++;
}
}else {
echo '上傳失敗';
return 5;
}
}
return $uploadedFiles;
}