设为首页收藏本站
开启辅助访问
切换到宽版

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索
查看: 3385|回复: 0
打印 上一主题 下一主题

用curl 实现远程数据提交,支持文件上传

[复制链接]

我玩的应用:

跳转到指定楼层
楼主
发表于 2012-10-9 18:23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不作赘述,请看程序中的注释和具体运行效果
  example.php:


  1. <?php
  2. if ($_SERVER['REQUEST_METHOD']=='POST')
  3. {
  4.  require_once("client.php");
  5.  
  6.  $curl = new CurlForm("http://pams.cn/server.php");
  7.  $curl->post();
  8. }
  9. ?>
  10. <div>
  11. <form enctype="multipart/form-data" action="" method="post">
  12. <input type="text" name="name" />
  13. <input type="file" name="file" />
  14. <input type="file" name="file1[]" />
  15. <input type="file" name="file1[]" />
  16. <input type="submit" />
  17. </form>
  18. </div>


复制代码
client.php:

  1. <?php
  2. /**
  3.  * Class CurlForm
  4.  *
  5.  * submit form data to a remote server use CURL
  6.  * file upload support
  7.  *
  8.  * @link        http://www.pams.cn
  9.  * @author      Gavin yang
  10.  * @msn:        athotmail88 @ hotmail.com
  11.  */
  12. class CurlForm
  13. {
  14.  /**
  15.      * url where you want to submit the form
  16.      * @var String
  17.      */
  18.   private $remoteUrl;
  19.  
  20.  /**
  21.      * form vars
  22.      * @var Array
  23.      */
  24.   private $postvars = array();
  25.  
  26.  /*
  27.  * Constructor for CurlForm
  28.  * @param String $remoteUrl url where you want to submit the form
  29.  */
  30.  public function __construct($remoteUrl)
  31.  {
  32.   $this->remoteUrl = $remoteUrl;




  33. /*处理提交上来的表单变量,将post变量和files变量同时放入$this->postvars 中,注意,这里是返回的是数组,当然如果只是post变量也可以是字符串"a=b&c=d"的形式,如果含有files变量,就只能放在数组里面*/
  34.   if(isset($_POST))
  35.   {
  36.    foreach ($_POST as $var => $val)
  37.    {
  38.     $this->postvars[$var] = $val;
  39.    }
  40.   }




  41. /*上传文件的过程实际上分两步,第一步将文件上传到本地服务器,然后取得文件在本地服务器的缓存地址,也就是tmp_name;第二步是将这个缓 存文件的数据发送到远程服务器,当然读取文件数据的过程已经在curl函数内部实现了,只要你在文件地址前面加上"@",curl就会认为这是个要传送的 附件,但要保证这个文件是真实存在的。这样远程服务器端就接收到本地服务器提交过去的表单,由于向远程服务器上传的文件是本地服务器上的缓存文件,所以要 取得原始文件的文件名,在post变量里我给增加了一个叫做'filename'的变量,它是和files变量一一对应的*/
  42.   if(isset($_FILES))
  43.   {
  44.    foreach ($_FILES as $var => $val)
  45.    {
  46.     if (is_array($val['tmp_name']))
  47.     {
  48.      foreach ($val['tmp_name'] as $k=>$fname)
  49.      {
  50.       $this->postvars[$var."[$k]"]= "@".$fname;
  51.       $this->postvars['filename'."[$var][$k]"]=  $val['name'][$k];
  52.      }
  53.     }
  54.     else
  55.     {
  56.      $this->postvars[$var] = "@".$val['tmp_name'];
  57.      $this->postvars['filename'."[$var]"] = $val['name'];
  58.     }
  59.    }
  60.   }
  61.  }




  62.  /*
  63.  * post form to remote server
  64.  */
  65.  public function post()
  66.  {
  67.   set_time_limit(0);
  68.      $ch = curl_init();
  69.   //设定远程地址
  70.      curl_setopt($ch, CURLOPT_URL, $this->remoteUrl );
  71.   //post方法
  72.      curl_setopt($ch, CURLOPT_POST, 1);
  73.   //表单变量
  74.      curl_setopt($ch, CURLOPT_POSTFIELDS, $this->postvars);
  75.   //设定是否直接显示返回的数据
  76.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
  77.   //设定是否显示头信息
  78.   curl_setopt($ch, CURLOPT_HEADER, false);
  79.   //设定是否直接输出页面内容 false为输出
  80.   curl_setopt($ch, CURLOPT_NOBODY, false);
  81.   curl_exec($ch);
  82.   //出错则显示错误并退出
  83.         curl_errno($ch) && die(curl_error($ch));
  84.   //关闭资源
  85.      curl_close($ch);
  86.   exit();
  87.  }
  88. }
  89. ?>
复制代码
server.php

  1. <?php
  2. print_r($_POST);
  3. print_r($_FILES);
  4. ?>
复制代码
from:http://blog.csdn.net/phphot/article/details/2151138
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2024-9-22 07:01 , Processed in 0.123447 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表