这是我的解决方案,我阅读了很多帖子,它们真的很有帮助。最终,我使用cURL和PHP为小文件编写了一些代码,我认为这非常有用。
public function postFile()
{
$file_url = "test.txt";
$eol = "\r\n";
$BOUNDARY = md5(time());
$BODY="";
$BODY.= '--'.$BOUNDARY. $eol;
$BODY .= 'Content-Disposition: form-data; name="sometext"' . $eol . $eol;
$BODY .= "Some Data" . $eol;
$BODY.= '--'.$BOUNDARY. $eol;
$BODY.= 'Content-Disposition: form-data; name="somefile"; filename="test.txt"'. $eol ;
$BODY.= 'Content-Type: application/octet-stream' . $eol;
$BODY.= 'Content-Transfer-Encoding: base64' . $eol . $eol;
$BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol;
$BODY.= '--'.$BOUNDARY .'--' . $eol. $eol;
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'X_PARAM_TOKEN : 71e2cb8b-42b7-4bf0-b2e8-53fbd2f578f9' //custom header for my api validation you can get it from $_SERVER["HTTP_X_PARAM_TOKEN"] variable
,"Content-Type: multipart/form-data; boundary=".$BOUNDARY)
);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0');
curl_setopt($ch, CURLOPT_URL, "api.endpoint.post");
curl_setopt($ch, CURLOPT_COOKIEJAR, $BOUNDARY.'.txt');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); navigate the endpoint
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY);
$response = curl_exec($ch);
print_r($response);
}
使用这个,我们应该在"api.endpoint.post"上接收到以下变量。您可以使用此脚本轻松测试,并且您应该在函数postFile()
的最后一行收到这些调试信息。
print_r($response);
public function getPostFile()
{
echo "\n\n_SERVER\n";
echo "<pre>";
print_r($_SERVER['HTTP_X_PARAM_TOKEN']);
echo "/<pre>";
echo "_POST\n";
echo "<pre>";
print_r($_POST['sometext']);
echo "/<pre>";
echo "_FILES\n";
echo "<pre>";
print_r($_FILEST['somefile']);
echo "/<pre>";
}
它应该能够正常工作,可能会有更好的解决方案,但这个方法有效且有助于理解PHP和cURL库中的边界和多部分/form-data MIME是如何工作的。
image=@/..
中的@
是指文件路径是相对于当前项目目录的根目录。 - Timo