一般的应用网站,尤其cms类的网站,上传图片、文件是很常见的功能,但一般上传文件实现都是保存在本网站所在上传文件夹下,也就是上传的图片文件跟随程序文件一起来部署的,这样一般来说没什么问题,但是文件增大后,移植和部署有些不够灵活,如果把这个上传文件目录独立出来,单独部署,存储在不同的服务器上(文件服务器),这样单独维护,比较灵活,分散程序服务器的压力,对网站的优化也很有帮助。下面给出一个PHP实现的ftp远程上传文件的方法。
注:本文使用的是thinkphp框架,其他框架实现方法也类似。
服务端上传文件的代码方法如下:
public function upload_images_ftp($file,$exts,$path){
$local_filename = $file['name'];
$extName=explode('.',$local_filename)[1];
if(!in_array($extName,$exts)){ return '不支持此上传文件类型.'; }
$local_file = $file['tmp_name'];
//ftp连接参数配置
$host = C('ftp_host'); $user =C('ftp_user'); $pwd=C('ftp_password');
try{
$ftp_conn = ftp_connect($host);
if(!$ftp_conn){ return "远程连接错误"; }
$login = @ftp_login($ftp_conn, $user, $pwd);
if(!$login){ ftp_close($ftp_conn); return "远程连接参数错误!"; }
$ftp_dir = $path;
!@ftp_mkdir($ftp_conn, $ftp_dir);
$saveName=time().mt_rand(100000,999999).'.'.$extName;
$remoteFile=$ftp_dir.'/'.$saveName;
if(!file_exists($local_file)){
ftp_close($ftp_conn);
return "上传文件错误,无效生成本地文件.";
}
ftp_set_option($ftp_conn, FTP_USEPASVADDRESS, false); //考虑到不同ftp环境,需要加此参数,否则可能会出现连接超时错误
ftp_pasv($ftp_conn, true);
@ftp_put($ftp_conn,$remoteFile,$local_file,FTP_BINARY);
ftp_close($ftp_conn);//fclose($fp);
}catch(Exception $e){
ftp_close($ftp_conn); return '上传出现异常:'.$e->getMessage();
}
$info=array('savepath'=>$ftp_dir.'/','savename'=>$saveName);
return $info;
}
调用上传的方法代码如下:
//上传图片
if (!empty($_FILES["file"]["tmp_name"])) {
//文件上传
$info = $this->upload_images_ftp($_FILES["file"],array('jpg','png','jpeg'),'imgs/'.date(Ymd));
if(!is_array($info)) {// 上传错误提示错误信息
$this->error($info);
}else{// 上传成功 获取上传文件信息
$Pic = $info['savepath'].$info['savename'];
//存取上传文件路径的处理...
}
}
前端页面比较简单,只要写一个form表单,增加一个输入文件的控件 <input type="file" name="file">,这个不再赘述。