应该可以:这是通过浏览器发布的表格(忽略了不相关的字段):
POST http://host.example.com/somewhere HTTP/1.1Content-Type: multipart/form-data; boundary=---------------------------7da16b2e4026cContent-Length: 105732-----------------------------7da16b2e4026cContent-Disposition: form-data; name="NewFile"; filename="test.jpg"Content-Type: image/jpeg(...raw JPEG data here...)-----------------------------7da16b2e4026cContent-Disposition: form-data; name="otherformfield"content of otherformfield is this text-----------------------------7da16b2e4026c--
因此,如果我们自己构建POST主体并设置一个或多个额外的标头,则我们应该能够模拟此:
// form field separator$delimiter = '-------------' . uniqid();// file upload fields: name => array(type=>'mime/type',content=>'raw data')$fileFields = array( 'file1' => array( 'type' => 'text/plain', 'content' => '...your raw file content goes here...' ), );// all other fields (not file upload): name => value$postFields = array( 'otherformfield' => 'content of otherformfield is this text', );$data = '';// populate normal fields first (simpler)foreach ($postFields as $name => $content) { $data .= "--" . $delimiter . "rn"; $data .= 'Content-Disposition: form-data; name="' . $name . '"'; // note: double endline $data .= "rnrn";}// populate file fieldsforeach ($fileFields as $name => $file) { $data .= "--" . $delimiter . "rn"; // "filename" attribute is not essential; server-side scripts may use it $data .= 'Content-Disposition: form-data; name="' . $name . '";' . ' filename="' . $name . '"' . "rn"; // this is, again, informative only; good practice to include though $data .= 'Content-Type: ' . $file['type'] . "rn"; // this endline must be here to indicate end of headers $data .= "rn"; // the file itself (note: there's no encoding of any kind) $data .= $file['content'] . "rn";}// last delimiter$data .= "--" . $delimiter . "--rn";$handle = curl_init($url);curl_setopt($handle, CURLOPT_POST, true);curl_setopt($handle, CURLOPT_HTTPHEADER , array( 'Content-Type: multipart/form-data; boundary=' . $delimiter, 'Content-Length: ' . strlen($data))); curl_setopt($handle, CURLOPT_POSTFIELDS, $data);curl_exec($handle);这样,我们正在做所有繁重的工作,并相信cURL不会破坏它。



