- 2016 09/06
原理:将远程图片二进制封装成http数据包提交到表单
<?php
//远程图片转POST $k name参数
function updateInternetImg($file,$boundary,$k='media') {
// invalid characters for "name" and "filename"
static $disallow = array("", """, "r", "n");
// build file parameters
$data = file_get_contents($file);
$v = call_user_func("end", explode('/', $file));
$type = call_user_func("end", explode('.', $file));
$v = str_replace($disallow, "_", $file);
$body[] = implode("rn", array(
"Content-Disposition: form-data; name="{$k}"; filename="{$v}"",
"Content-Type: image/".$type,
"",
$data,
));
// generate safe boundary
do {
$boundary = $boundary;
} while (preg_grep("/{$boundary}/", $body));
// add boundary for each parameters
array_walk($body, function (&$part) use ($boundary) {
$part = "--{$boundary}rn{$part}";
});
// add final boundary
$body[] = "--{$boundary}--";
$body[] = "";
// set options
return implode("rn", $body);
}
$ch = curl_init("http://127.0.0.1");
$boundary = "---------------------" . md5(mt_rand() . microtime());
$re = updateInternetImg("http://127.0.0.1/logo.png",$boundary);
curl_setopt($ch,CURLOPT_POSTFIELDS,$re);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,array(
"Expect: 100-continue",
"Content-Type: multipart/form-data; boundary={$boundary}", // change Content-Type
));
$re = curl_exec($ch);
if($re){
var_dump($re);
}
curl_close($ch);
?>

