PHP使用FTP上传文件到服务器(实战篇)
我们在做开发的过程中,上传文件肯定是避免不了的,平常我们的程序和上传的文件都在一个服务器上,我们也可以使用第三方sdk上传文件,但是文件在第三方服务器上。现在我们使用PHP的ftp功能把文件上传到我们自己的服务器,我使用的linux的服务器,首先确保服务器上配置好ftp,以vsftpd为例。
FTP类,此类包含把文件上传、下载、删除和删除ftp服务器目录功能,php版本>=7.0
<?php
/**
* Created by PhpStorm.
* User: 123456
* Date: 2018/9/20
* Time: 11:15
* @author sunjiaqiang
* @email 1355049422@qq.com
*/
class Ftp{
private $host='';//远程服务器地址
private $user='';//ftp用户名
private $pass='';//ftp密码
private $port=21;//ftp登录端口
private $error='';//最后失败时的错误信息
protected $conn;//ftp登录资源 /**
* 可以在实例化类的时候配置数据,也可以在下面的connect方法中配置数据
* Ftp constructor.
* @param array $config
*/
public function __construct(array $config=[])
{
empty($config) OR $this->initialize($config);
} /**
* 初始化数据
* @param array $config 配置文件数组
*/
public function initialize(array $config=[]){
$this->host = $config['host'];
$this->user = $config['user'];
$this->pass = $config['pass'];
$this->port = isset($config['port']) ?: 21;
} /**
* 连接及登录ftp
* @param array $config 配置文件数组
* @return bool
*/
public function connect(array $config=[]){
empty($config) OR $this->initialize($config);
if (FALSE == ($this->conn = @ftp_connect($this->host))){
$this->error = "主机连接失败";
return FALSE;
}
if ( ! $this->_login()){
$this->error = "服务器登录失败";
return FALSE;
}
return TRUE;
} /**
* 上传文件到ftp服务器
* @param string $local_file 本地文件路径
* @param string $remote_file 服务器文件地址
* @param bool $permissions 文件夹权限
* @param string $mode 上传模式(ascii和binary其中之一)
*/
public function upload($local_file='',$remote_file='',$mode='auto',$permissions=NULL){
if ( ! file_exists($local_file)){
$this->error = "本地文件不存在";
return FALSE;
}
if ($mode == 'auto'){
$ext = $this->_get_ext($local_file);
$mode = $this->_set_type($ext);
}
//创建文件夹
$this->_create_remote_dir($remote_file);
$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
$result = @ftp_put($this->conn,$remote_file,$local_file,$mode);//同步上传
if ($result === FALSE){
$this->error = "文件上传失败";
return FALSE;
}
return TRUE;
} /**
* 从ftp服务器下载文件到本地
* @param string $local_file 本地文件地址
* @param string $remote_file 远程文件地址
* @param string $mode 上传模式(ascii和binary其中之一)
*/
public function download($local_file='',$remote_file='',$mode='auto'){
if ($mode == 'auto'){
$ext = $this->_get_ext($remote_file);
$mode = $this->_set_type($ext);
}
$mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY;
$result = @ftp_get($this->conn, $local_file, $remote_file, $mode);
if ($result === FALSE){
return FALSE;
}
return TRUE;
} /**
* 删除ftp服务器端文件
* @param string $remote_file 文件地址
*/
public function delete_file(string $remote_file=''){
$result = @ftp_delete($this->conn,$remote_file);
if ($result === FALSE){
return FALSE;
}
return TRUE;
}
/**
* ftp创建多级目录
* @param string $remote_file 要上传的远程图片地址
*/
private function _create_remote_dir($remote_file='',$permissions=NULL){
$remote_dir = dirname($remote_file);
$path_arr = explode('/',$remote_dir); // 取目录数组
//$file_name = array_pop($path_arr); // 弹出文件名
$path_div = count($path_arr); // 取层数
foreach($path_arr as $val) // 创建目录
{
if(@ftp_chdir($this->conn,$val) == FALSE)
{
$tmp = @ftp_mkdir($this->conn,$val);//此处创建目录时不用使用绝对路径(不要使用:2018-02-20/ceshi/ceshi2,这种路径),因为下面ftp_chdir已经已经把目录切换成当前目录
if($tmp == FALSE)
{
echo "目录创建失败,请检查权限及路径是否正确!";
exit;
}
if ($permissions !== NULL){
//修改目录权限
$this->_chmod($val,$permissions);
}
@ftp_chdir($this->conn,$val);
}
} for($i=0;$i<$path_div;$i++) // 回退到根,因为上面的目录切换导致当前目录不在根目录
{
@ftp_cdup($this->conn);
}
} /**
* 递归删除ftp端目录
* @param string $remote_dir ftp目录地址
*/
public function delete_dir(string $remote_dir=''){
$list = $this->list_file($remote_dir);
if ( ! empty($list)){
$count = count($list);
for ($i=0;$i<$count;$i++){
if ( ! preg_match('#\.#',$list[$i]) && !@ftp_delete($this->conn,$list[$i])){
//这是一个目录,递归删除
$this->delete_dir($list[$i]);
}else{
$this->delete_file($list[$i]);
}
}
}
if (@ftp_rmdir($this->conn,$remote_dir) === FALSE){
return FALSE;
}
return TRUE;
} /**
* 更改 FTP 服务器上的文件或目录名
* @param string $old_file 旧文件/文件夹名
* @param string $new_file 新文件/文件夹名
*/
public function remane(string $old_file='',string $new_file=''){
$result = @ftp_rename($this->conn,$old_file,$new_file);
if ($result === FALSE){
$this->error = "移动失败";
return FALSE;
}
return TRUE;
} /**
* 列出ftp指定目录
* @param string $remote_path
*/
public function list_file(string $remote_path=''){
$contents = @ftp_nlist($this->conn, $remote_path);
return $contents;
} /**
* 获取文件的后缀名
* @param string $local_file
*/
private function _get_ext($local_file=''){
return (($dot = strrpos($local_file,'.'))==FALSE) ? 'txt' : substr($local_file,$dot+1);
} /**
* 根据文件后缀获取上传编码
* @param string $ext
*/
private function _set_type($ext=''){
//如果传输的文件是文本文件,可以使用ASCII模式,如果不是文本文件,最好使用BINARY模式传输。
return in_array($ext, ['txt', 'text', 'php', 'phps', 'php4', 'js', 'css', 'htm', 'html', 'phtml', 'shtml', 'log', 'xml'], TRUE) ? 'ascii' : 'binary';
} /**
* 修改目录权限
* @param $path 目录路径
* @param int $mode 权限值
*/
private function _chmod($path,$mode=0755){
if (FALSE == @ftp_chmod($this->conn,$path,$mode)){
return FALSE;
}
return TRUE;
} /**
* 登录Ftp服务器
*/
private function _login(){
return @ftp_login($this->conn,$this->user,$this->pass);
} /**
* 获取上传错误信息
*/
public function get_error_msg(){
return $this->error;
}
/**
* 关闭ftp连接
* @return bool
*/
public function close(){
return $this->conn ? @ftp_close($this->conn_id) : FALSE;
}
}
使用方法,包含文件上传、下载、删除、移动以及删除整个文件夹
<?php
/**
* Created by PhpStorm.
* User: 123456
* Date: 2018/9/20
* Time: 14:07
*/
declare(strict_types=1);
include 'Ftp.php';
$config = [
'host'=>'192.168.0.148',
'user'=>'ftpuser',
'pass'=>'123456'
];
$ftp = new Ftp($config);
$result = $ftp->connect();
if ( ! $result){
echo $ftp->get_error_msg();
} $local_file = 'video3.mp4';
$remote_file = date('Y-m').'/video3.mp4'; //上传文件
if ($ftp->upload($local_file,$remote_file)){
echo "上传成功";
}else{
echo "上传失败";
}
//删除文件
if ($ftp->delete_file($remote_file)){
echo "删除成功";
}else{
echo "删除失败";
} //删除整个目录
$remote_path='2018-09-19';
if ($ftp->delete_dir($remote_path)){
echo "目录删除成功";
}else{
echo "目录删除失败";
} //下载文件
$local_file2 = 'video5.mp4';
$remote_file2='video3.mp4';
if ($ftp->download($local_file2,$remote_file2)){
echo "下载成功";
}else{
echo "下载失败";
} //移动文件|重命名文件
$local_file3 = 'video3.mp4';
$remote_file3='shangchuan3/video3.mp4';
if ($ftp->remane($local_file3,$remote_file3)){
echo "移动成功";
}else{
echo "移动失败";
}
$ftp->close();
//p($result); function p($data=''){
echo '<pre>';
print_r($data);
echo '</pre>';
}
以上就是php使用ftp上传文件到自己的服务器,如有不对的地方还请大家指正。
PHP使用FTP上传文件到服务器(实战篇)的更多相关文章
- C# FTP上传文件至服务器代码
C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
- Linux通过FTP上传文件到服务器
1.如果没有安装ftp,可执行: 输入:yum -y install ftp,回车 等待安装完毕 2.连接服务器 输入:ftp 服务器IP,回车 根据提示输入用户名和密码 3.上传下载操作 1). 上 ...
- ftp上传文件,本地安装了,服务器上也需要在也安装一个ftp
服务器需要配置FTP服务: 你说的在你自己电脑上安装的只是一个FTP软件,用于连接远程服务器进行上传和下载文件的. 追问 在本地已经安装了,链接的话要在服务器上也安装一个吗? 追答 额,你有FTP服务 ...
- C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误
FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...
- 再看ftp上传文件
前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...
- FTP上传文件提示550错误原因分析。
今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...
- FTP 上传文件
有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...
- Java ftp 上传文件和下载文件
今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...
随机推荐
- 【ZROI 537】贪心题 题解
[ZROI 537]贪心题 题解 Link Solution 最大的一边直接放到一起贪心即可 着重讲小的一边 已知对于二分图匹配,其答案即为最大流 令时间集合为 \(T = {1,2,3,\dots, ...
- 命令行音乐播放器 CMus
自从接触到 CMus (C* Music Player) 这个工作在终端里的音乐播放器后,在 Linux 环境里就很少使用 GUI 音乐播放器播放本地音乐文件了.它消耗资源少使用方便,对中文的支持也不 ...
- Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率和决策树多元分类使用.precision方法以precision来评估模型的准确率(图文详解)
不多说,直接上干货! Spark Mllib里决策树二元分类使用.areaUnderROC方法计算出以AUC来评估模型的准确率 具体,见 Hadoop+Spark大数据巨量分析与机器学习整合开发实战的 ...
- 浅谈C#解析网页
最近做了一个项目,要求获取各大主流网页上的关键信息,本人以前了解过网页爬虫的知识,所以想到了网页爬虫了实现功能 第一次尝试: 采用webclient获取远程网页的内容,然后采用正则表达式进行过滤 但, ...
- sql语句优化及后一条减前一条
sql语句优化: 1.表加索引 2.少用like,直接用=所有值 3.where语句把能大量筛查的条件写在前面 4.数据量大时,参与计算的值相同时只取一条 后一条减前一条, select houec, ...
- Appium基础三:Appium实现原理
1.web自动化测试用的selenium webdriver 是c/s模式,server端和client端是通过webdriver protocol实现的,而Appium是参考selenium开发的, ...
- php分页代码及总结
代码部分: <?PHPheader("Content-type:text/html;charset=utf-8");$pageSize = 10;//接收传入的分页码$pag ...
- <转>Spring 知识点提炼
Spring 知识点提炼 1. Spring框架的作用 轻量:Spring是轻量级的,基本的版本大小为2MB 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依 ...
- 编写生成32位大写和小写字符的md5的函数
package nicetime.com.practise; import java.security.MessageDigest; /** * MD5加密是JAVA应用中常见的算法,请写出两个MD5 ...
- SQL 事物回滚
转自https://www.cnblogs.com/delphinet/archive/2010/08/17/1801424.html 第一种: declare @iErrorCount ...