请教用Curl 在php 里面模拟表单提交 文本+文件的写法

pooy 发布于 2012/09/10 14:45
阅读 8K+
收藏 3

用Curl 在php 里面模拟表单提交

注:文本+文件

模拟文本的写好了,模拟文件的写好了。但是需求是提交的表单中包含文本+上传文件。

这个就头疼了,帮我出下主意吧!

模拟文本:

$username = 'admin';
$password = 'admin';
$fp = fsockopen('www.pooy.net', '80', $errno, $errstr, 1);

$post = "username=$username&password=$password";
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "POST /SJzgImgEdit/login HTTP/1.1\r\n";
    $out .= "Host: www.pooy.net\r\n";
    $out .= 'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1 FirePHP/0.6'. "\r\n";
    $out .= 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
    $out .= 'Content-Length: '. strlen($post). "\r\n";
    $out .= "Connection: Close\r\n\r\n";
    $out .= $post . "\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);	
    }
    fclose($fp);
}


CURL POST 上传文件(模拟页面)

define('UPLOAD_IMG','http://www.pooy.net/Snoopy/upload.php');
function upload_curl_pic($file)
{
    $url  = UPLOAD_IMG; 
    $fields['f'] = '@'.$file;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url );
    curl_setopt($ch, CURLOPT_POST, 1 );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields );
   
    ob_start();
    curl_exec($ch);
    $result = ob_get_contents();
    ob_end_clean();
    curl_close($ch);
    return $result;
}
$file = 'H:\www\test\psuCARGLSPA-pola.jpg'; //要上传的文件
$src = upload_curl_pic($file);
echo $src;

CURL POST 上传文件(处理页面)

	header("content-type:text/html;charset=utf-8");
	//防止上传

        //$file=$_FILES['f'];
	//var_dump($file);
	exit();
	
	$uploaddir = "H:/www/test/Snoopy/test/";
	$uploadfile = $uploaddir . $_FILES['f']['name'];
	if(move_uploaded_file($_FILES['f']['tmp_name'], $uploadfile))
	{ 
		 echo $uploadfile;
		 //echo "File is valid, and was successfully uploaded.\n";
	}
	else
	{
		echo '0';
		//echo "Possible file upload attack!\n";
		//echo 'Here is some more debugging info:';
	}

请问一个表单里面有3个文本框,一个file文件框。我一次要模拟这四个数据一起提交到后台怎么写?

加载中
0
pooy
pooy

用一个数组:

    $post_data = array(
						 "title"=>"PIC!!!",
						 "f"=>"@".$file
	);
    $url  = UPLOAD_IMG; 
    //$fields['f'] = '@'.$file;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url );
    curl_setopt($ch, CURLOPT_POST, 1 );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data );

代替之前的那个,然后就可以了

打印

	var_dump($_POST);
	var_dump($_FILES);

结果为:

array
  'title' => string 'PIC!!!' (length=10)

array
  'f' => 
    array
      'name' => string 'psuCARGLSPA-pola.jpg' (length=20)
      'type' => string 'application/octet-stream' (length=24)
      'tmp_name' => string 'E:\wamp\tmp\phpA6A6.tmp' (length=23)
      'error' => int 0
      'size' => int 268516

搞定了 哈哈

0
freeskyala
freeskyala
C:\Documents and Settings\Administrator\桌面\picture\8.jpg  为什么换成桌面的路径 就不行了呢? 还是有中文的原因  我喜欢你的代码高亮 我也下了 可是怎么调宽度呢? 我的复制根本就不好使哇 求 解答……
0
pooy
pooy

引用来自“freeskyala”的答案

C:\Documents and Settings\Administrator\桌面\picture\8.jpg  为什么换成桌面的路径 就不行了呢? 还是有中文的原因  我喜欢你的代码高亮 我也下了 可是怎么调宽度呢? 我的复制根本就不好使哇 求 解答……
为什么要用中文呢?多年的开发经验告诉我,在做开发的时候文件路径名称都不要带中文。
freeskyala
freeskyala
php 新手 加我呗 大虾 qq 452440296 ……
freeskyala
freeskyala
嗯 但是 <input type="file" name="pic">你选完图片的时候 路径就那样的 C:\Documents and Settings\Administrator\桌面\picture\8.jpg 你怎么办 ??? 是从桌面点的哇 ???
0
freeskyala
freeskyala
嗯 但是  <input type="file" name="pic">你选完图片的时候 路径就那样的 C:\Documents and Settings\Administrator\桌面\picture\8.jpg  你怎么办  ??? 是从桌面点的哇 ???
0
pooy
pooy

朋友我这个是CURL模拟登陆上传文件,不是uploadify。

可以参考:http://www.pooy.net/uploadify-php.html

返回顶部
顶部