php curl 模拟post上传文件应用实例

kevin.Zhu 发布于:2013-1-16 15:39 分类:Php  有 14 人浏览,获得评论 0 条  

今天工作中遇到一个问题,客户端上传头像,我得到这个$_FILES头像信息,还需要通过模拟表单的type=file方式传递给公司的静态图片地址服务器,并最终从图片服务器拿到图片的绝对地址。

通过思考,实践,确定通过curl模拟表单来进行上传文件;

测试代码如下:

表单:1.html

<form method="POST" action="http://localhost/up.php" enctype="multipart/form-data">

用户头像:<input type="file" name="image">

<input type="submit" name="dosubmit">

</form>

 

处理程序:up.php

<?php

echo "<pre>";

print_r($_FILES);


$uploaddir = 'D:/';

$uploadfile = $uploaddir . basename($_FILES['image']['name']);


if (move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile)) {

    echo "File is valid, and was successfully uploaded.\n";

} else {

    echo "Possible file upload attack!\n";

}

echo 'Here is some more debugging info:';



$url = "http://localhost/app.php";

$data = array(

"file1"  => "@D:/".$_FILES['image']['name'],    (这里需要注意:不能上传临时地址,而只能是存在的物理绝对路径)

);

print_r(uploadByCURL($data,$url));


function uploadByCURL($post_data,$post_url){

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $post_url);

curl_setopt($curl, CURLOPT_POST, 1 );

curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl,CURLOPT_USERAGENT,"Mozilla/4.0");

$result = curl_exec($curl);

$error = curl_error($curl);

return $error ? $error : $result;

}

?>

 

第二次,file提交的处理程序

app.php

<?php

echo "<pre>";

print_r($_FILES);


$uploaddir = 'e:/';

$uploadfile = $uploaddir . basename($_FILES['file1']['name']);


echo '<pre>';

if (move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile)) {

    echo "File is valid, and was successfully uploaded.\n";

} else {

    echo "Possible file upload attack!\n";

}


echo 'Here is some more debugging info:';

?>

通过这三个程序,图片就可以经过两次提交,最终得到图片的地址;