首页 > 语言 > PHP > 正文

PHP文件上传实现上传到另一台服务器

2024-09-04 11:44:53
字体:
来源:转载
供稿:网友

在php中我们如果要上传到另一台服务器就需要利用php一个ftp功能,在php中提供了 ftp_connect来连接服务器,然后把我们上传的数据传到远程服务器.

ftp_connect() 函数建立一个新的 FTP 连接,若成功,则返回一个连接标识,否则返回 false.

语法:ftp_connect(host,port,timeout)

host 必需,规定要连接的 FTP 服务器,可以是域名或 IP 地址,后面不应以斜线结尾,前面也不需要用 ftp:// 开头.

port 可选,规定 FTP 服务器的端口.

timeout 可选,规定该 FTP 服务器的超时时间,默认是 90 秒.

然后在台式机本地做了个测试,代码如下:

  1. $ftp_server = "192.168.1.100"
  2. $ftp_user_name = "laohu"
  3. $ftp_user_pass = "123456"
  4. $conn_id = ftp_connect($ftp_serveror die("Couldn't connect to $ftp_server"); 
  5. $file = 'test.txt'
  6. $remote_file = '/test/a.txt';   
  7. // 注意:这里的"/test"指的是ftp根目录下的test文件夹,而非系统跟目录下的 test 
  8. $login_result = ftp_login($conn_id$ftp_user_name$ftp_user_pass); 
  9. if (ftp_put($conn_id$remote_file$file, FTP_BINARY)) { 
  10.   echo "文件移动成功"
  11. else { 
  12.   echo "移动失败"
  13. ftp_close($conn_id); 

运行后,文件移动成功.

要的就是这个效果了,之后用台式机做程序服务器,上传附件时全用ftp方法上传至笔记本上,笔记本ip是105,相应代码如下:

  1. if (is_uploaded_file($_FILES['uploadfile']['tmp_name'])) { 
  2.   $ftp_server = "192.168.1.105"
  3.   $ftp_user_name = "lesley"
  4.   $ftp_user_pass = "123456"
  5.   $conn_id = ftp_connect($ftp_serveror die("Couldn't connect to $ftp_server"); 
  6.   $file = $_FILES['uploadfile']['tmp_name']; 
  7.   $remote_file = '/test/'.$_FILES['uploadfile']['name']; 
  8.   $login_result = ftp_login($conn_id$ftp_user_name$ftp_user_pass); 
  9.  
  10.   if (ftp_put($conn_id$remote_file$file, FTP_BINARY)) { 
  11.     echo "文件:".$_FILES['uploadfile']['name']."上传成功"
  12.   } else { 
  13.     echo "上传失败"
  14.   } 
  15.   ftp_close($conn_id); 

对应的前台页面代码如下:

  1. <form action="uploadfile.php" method="post" enctype="multipart/form-data"> 
  2.   <input type="file" name="uploadfile" id="uploadfile" /> 
  3.   <input type="submit" name="submit" value="submit" /> 
  4. </form> 

运行后确实成功,下面看一个ftp文件上传类,代码如下:

  1. <?php   
  2. /**  
  3. * desc:FTP类 
  4. * link:www.Vevb.com 
  5. * date:2013/02/24  
  6. */   
  7. class ftp   
  8. {   
  9. public $off;  // 返回操作状态(成功/失败)   
  10. public $conn_id;  // FTP连接   
  11.    
  12. /**  
  13. * 方法:FTP连接  
  14. * @FTP_HOST -- FTP主机  
  15. * @FTP_PORT -- 端口  
  16. * @FTP_USER -- 用户名  
  17. * @FTP_PASS -- 密码  
  18. */   
  19. function __construct($FTP_HOST,$FTP_PORT,$FTP_USER,$FTP_PASS)   
  20. {   
  21. $this->conn_id = @ftp_connect($FTP_HOST,$FTP_PORTor die("FTP服务器连接失败");   
  22. @ftp_login($this->conn_id,$FTP_USER,$FTP_PASSor die("FTP服务器登陆失败");  
  23. @ftp_pasv($this->conn_id,1); // 打开被动模拟   
  24. }   
  25.    
  26. /**  
  27. * 方法:上传文件  
  28. * @path-- 本地路径  
  29. * @newpath -- 上传路径  
  30. * @type-- 若目标目录不存在则新建  
  31. */   
  32. function up_file($path,$newpath,$type=true)   
  33. {   
  34. if($type$this->dir_mkdirs($newpath);   
  35. $this->off = @ftp_put($this->conn_id,$newpath,$path,FTP_BINARY);   
  36. if(!$this->off) echo "文件上传失败,请检查权限及路径是否正确!";   
  37. }   
  38.    
  39. /**  
  40. * 方法:移动文件  
  41. * @path-- 原路径  
  42. * @newpath -- 新路径  
  43. * @type-- 若目标目录不存在则新建  
  44. */   
  45. function move_file($path,$newpath,$type=true)   
  46. {   
  47. if($type$this->dir_mkdirs($newpath);   
  48. $this->off = @ftp_rename($this->conn_id,$path,$newpath);   
  49. if(!$this->off) echo "文件移动失败,请检查权限及原路径是否正确!";   
  50. }   
  51.    
  52. /**  
  53. * 方法:复制文件  
  54. * 说明:由于FTP无复制命令,本方法变通操作为:下载后再上传到新的路径  
  55. * @path-- 原路径  
  56. * @newpath -- 新路径  
  57. * @type-- 若目标目录不存在则新建  
  58. */   
  59. function copy_file($path,$newpath,$type=true)   
  60. {   
  61. $downpath = "c:/tmp.dat";   
  62. $this->off = @ftp_get($this->conn_id,$downpath,$path,FTP_BINARY);// 下载   
  63. if(!$this->off) echo "文件复制失败,请检查权限及原路径是否正确!";   
  64. $this->up_file($downpath,$newpath,$type);   
  65. }   
  66.    
  67. /**  
  68. * 方法:删除文件  
  69. * @path -- 路径  
  70. */   
  71. function del_file($path)   
  72. {   
  73. $this->off = @ftp_delete($this->conn_id,$path);   
  74. if(!$this->off) echo "文件删除失败,请检查权限及路径是否正确!";   
  75. }   
  76.    
  77. /**  
  78. * 方法:生成目录  
  79. * @path -- 路径  
  80. */   
  81. function dir_mkdirs($path)   
  82. {   
  83. $path_arr  = explode('/',$path);  // 取目录数组   
  84. $file_name = array_pop($path_arr);// 弹出文件名   
  85. $path_div  = count($path_arr);// 取层数   
  86.    
  87. foreach($path_arr as $val)// 创建目录   
  88. {   
  89. if(@ftp_chdir($this->conn_id,$val) == FALSE)   
  90. {   
  91. $tmp = @ftp_mkdir($this->conn_id,$val);   
  92. if($tmp == FALSE)   
  93. {   
  94. echo "目录创建失败,请检查权限及路径是否正确!";   
  95. exit;   
  96. }   
  97. @ftp_chdir($this->conn_id,$val);   
  98. }   
  99. }   
  100.    
  101. for($i=1;$i<=$path_div;$i++)  // 回退到根   
  102. {   
  103. @ftp_cdup($this->conn_id);   
  104. }   
  105. }   
  106.    
  107. /**  
  108. * 方法:关闭FTP连接  
  109. */   
  110. function close()   
  111. {   
  112. @ftp_close($this->conn_id);   
  113. }   
  114. }   
  115. // class class_ftp end  
  116. ?> 

调用代码,代码如下:

  1. <? 
  2. /*** 
  3. * desc:调用示例 
  4. * link:www.Vevb.com 
  5. * date:2013/2/24 
  6. */ 
  7. $ftp = new ftp('192.168.0.249',21,'hlj','123456');  // 打开FTP连接  
  8. $ftp->up_file('aa.wav','test/13548957217/bb.wav'); // 上传文件  
  9. //$ftp->move_file('aaa/aaa.php','aaa.php');// 移动文件  
  10. //$ftp->copy_file('aaa.php','aaa/aaa.php');// 复制文件  
  11. //$ftp->del_file('aaa.php');   // 删除文件  
  12. $ftp->close(); // 关闭FTP连接  
  13. ?> 

需要注意,在用ftp_put方法时,第四个参数传送模式,需要用FTP_BINARY(二进制模式),用FTP_ASCII(文本模式)时,图片能上传但无法显示,其他文件重命名、中文乱码解决、上传权限控制等,就不在此提及了.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表