Re: PHP cURL实现模拟登录与采集使用方法详解教程
对于数据采集回来的文件内容,有时候需要再次上传到其他的文件服务器上,此时,如果本地先存储再利用上面的方式提交到文件服务器,显然会多了一次IO写入和读取操作,对于这种情况,我们可以利用构造模拟上传请求头和构造数据报文,直接利用采集回来的文件内容上传到文件服务器:
[code] /**
* @author 如果的如果
* PHP利用cURL直接以文件内容形式上传文件
* @param string $url 文件上传处理链接
* @param array $fileFields 文件上传数据数组
* @param array $postFields 非文件表单数据数组
* @param array $curlOpt 扩展的CURLOPT_数据
* @return string
*/
function curlPostMemoryFile($url, $fileFields, $postFields = array(), $curlOpt = array()){
//构造post数据
$data = '';
$delimiter = '-------------' . uniqid();
// 表单数据
foreach ($postFields as $name => $content) {
$data .= "--" . $delimiter . "\r\n";
$data .= 'Content-Disposition: form-data; name="' . $name . '"';
$data .= "\r\n\r\n";
$data .= $content;
$data .= "\r\n";
//$data .= "--" . $delimiter . "\r\n";
}
// 文件上传数据
foreach ($fileFields as $inputName => $file) {
$data .= "--" . $delimiter . "\r\n";
$data .= 'Content-Disposition: form-data; name="' . $inputName . '";' .
' filename="' . $file['filename'] . '"' . "\r\n";
$data .= 'Content-Type: ' . $file['type'] . "\r\n";
$data .= "\r\n";
$data .= $file['content'] . "\r\n";
}
$data .= "--" . $delimiter . "--\r\n";
//post请求提交文件上传数据
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); //返回数据不直接输出
$header = array(
'Content-Type: multipart/form-data; boundary=' . $delimiter,
'Content-Length: ' . strlen($data)
);
if(isset($curlOpt[CURLOPT_HTTPHEADER])) {
$header = array_merge($header, $curlOpt[CURLOPT_HTTPHEADER]);
unset($curlOpt[CURLOPT_HTTPHEADER]);
}
curl_setopt($handle, CURLOPT_HTTPHEADER , $header);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
if(!empty($curlOpt)){
foreach($curlOpt as $key => $val){
curl_setopt($handle,$key,$val);
}
}
return curl_exec($handle);
}
//演示
$url = 'http://demo.zjmainstay.cn/php/curl/curlUploadHandler.php';
$filename = 'test.txt';
$fileContent = '测试直接文件内容形式上传文件';
$fileFields = array(
'upload_file' => array(
'filename' => $filename,
#从正常上传时的post数据中查看,对应$_FILES里的type
'type' => 'text/plain',
'content' => $fileContent,
),
);
$postFields = array(
'name' => 'Zjmainstay',
'age' => '26',
);
//此处测试CURLOPT_HTTPHEADER的合并
$header = array(
'Host: demo.zjmainstay.cn' ,
);
$curlOpt = array(
CURLOPT_HTTPHEADER => $header,
);
$content = curlPostMemoryFile($url, $fileFields, $postFields, $curlOpt);
var_dump($content);[/code]