レスポンスからzipファイルが必要な場合curlレスポンスを保存するためのtmpファイルを作成し、回避策としてストリームするといいでしょう: マルチパートのカールでこれを試したことはありませんが、動作するはずです。あなたは、応答のXML部分以外のものを必要としない場合
$fh = fopen('/tmp/foo', 'w');
$cUrl = curl_init('http://example.com/foo');
curl_setopt($cUrl, CURLOPT_FILE, $fh); // redirect output to filehandle
curl_exec($cUrl);
curl_close($cUrl);
fclose($fh); // close filehandle or the file will be corrupted
あなただけの応答
curl_setopt($cUrl, CURLOPT_HTTPHEADER, array('Accept: application/xml'));
//That's a workaround since there is no available curl option to do so but http allows that
としてXMLを受け入れるために、ヘッダー curl_setopt($cUrl, CURLOPT_HEADER, FALSE);
を無効にし、オプションを追加したい場合があります[編集]
暗闇の中でのショット... これらでテストできますか?変性するが、これらは何
$headers = array (
'Content-Type: multipart/form-data; boundary=' . $boundary,
'Content-Length: ' . strlen($requestBody),
'X-EBAY-API-COMPATIBILITY-LEVEL: ' . $compatLevel, // API version
'X-EBAY-API-DEV-NAME: ' . $devID,
'X-EBAY-API-APP-NAME: ' . $appID,
'X-EBAY-API-CERT-NAME: ' . $certID,
'X-EBAY-API-CALL-NAME: ' . $verb,
'X-EBAY-API-SITEID: ' . $siteID,
);
$cUrl = curl_init();
curl_setopt($cUrl, CURLOPT_URL, $serverUrl);
curl_setopt($cUrl, CURLOPT_TIMEOUT, 30);
curl_setopt($cUrl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($cUrl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($cUrl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($cUrl, CURLOPT_POST, 1);
curl_setopt($cUrl, CURLOPT_POSTFIELDS, $requestBody);
curl_setopt($cUrl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cUrl, CURLOPT_FAILONERROR, 0);
curl_setopt($cUrl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($cUrl, CURLOPT_HEADER, 0);
curl_setopt($cUrl, CURLOPT_USERAGENT, 'ebatns;xmlstyle;1.0');
curl_setopt($cUrl, CURLOPT_HTTP_VERSION, 1); // HTTP version must be 1.0
$response = curl_exec($cUrl);
if (!$response) {
print "curl error " . curl_errno($cUrl) . PHP_EOL;
}
curl_close($cUrl);
を助けるかどうかを確認するためにcurlopt設定[EDIT II]
述べたように、これは私が私のカールページがマルチパートフォームデータで応答することができません、ただ試しています。だからここに私と一緒に優しくして、適切なcurlopts
// Set callback function for header
curl_setopt($cUrl, CURLOPT_HEADERFUNCTION, 'read_header');
// Set callback function for body
curl_setopt($cUrl, CURLOPT_WRITEFUNCTION, 'read_body');
は うまくいけば、理由はメモリの問題の変数にカール応答を保存しないことを忘れないでください設定)
$content_type = ""; //use last know content-type as a trigger
$tmp_cnt_file = "tmp/tmpfile";
$xml_response = ""; // this will hold the "usable" curl response
$hidx = 0; //header index.. counting the number of different headers received
function read_header($cUrl, $string)// this will be called once for every line of each header received
{
global $content_type, $hidx;
$length = strlen($string);
if (preg_match('/Content-Type:(.*)/', $string, $match))
{
$content_type = $match[1];
$hidx++;
}
/*
should set $content_type to 'application/xop+xml; charset=utf-8; type="text/xml"' for the first
and to 'application/zip' for the second response body
echo "Header: $string<br />\n";
*/
return $length;
}
function read_body($cUrl, $string)
{
global $content_header, $xml_response, $tmp_cnt_file, $hidx;
$length = strlen($string);
if(stripos ($content_type , "xml") !== false)
$xml_response .= $string;
elseif(stripos ($content_type, "zip") !== false)
{
$handle = fopen($tmp_cnt_file."-".$hidx.".zip", "a");
fwrite($handle, $string);
fclose($handle);
}
/*
elseif {...} else{...}
depending on your needs
echo "Received $length bytes<br />\n";
*/
return $length;
}
そしてもちろんあなたが必要とするのは、上記の$ xml_responseの中にあります。
//$response = curl_exec($cUrl);
curl_exec($cUrl);
そして、あなたは$xml_response
を参照すると、このシナリオでtmp/tmpfile-2
で始まる作成した一時ファイルができ、あなたのコードを解析するため。繰り返しますが、上記のコードをどのような方法でもテストすることはできませんでした。 (それは私見べき;)だから、これは動作しない場合があります
我々はこのような場合には、ソケット接続を別の(送信)ストリームに直接すべての着信データを書き込むことがカールたいと
[IIIは、EDIT])
私はそれがこのように簡単であるかどうかわからないんだけど:
$fs = fsockopen($host, $port, $errno, $errstr);
$cUrl = curl_init('http://example.com/foo');
curl_setopt($cUrl, CURLOPT_FILE, $fs); // redirect output to sockethandle
curl_exec($cUrl);
curl_close($cUrl);
fclose($fs); // close handle
他
我々は
//first open the socket (before initiating curl)
$fs = fsockopen($host, $port, $errno, $errstr);
// now for the new callback function
function socket_pipe($cUrl, $string)
{
global $fs;
$length = strlen($string);
fputs($fs, $string); // add NOTHING to the received line just send it to $fs; that was easy wasn't it?
return $length;
}
// and of course for the CURLOPT part
// Set callback function for header
curl_setopt($cUrl, CURLOPT_HEADERFUNCTION, 'socket_pipe');
// Set the same callback function for body
curl_setopt($cUrl, CURLOPT_WRITEFUNCTION, 'socket_pipe');
// do not forget to
fclose($fs); //when we're done
0ほんの少しのトリックと私たちの知ら書き込みやヘッダの機能を使用する必要があります
結果は編集結果ではなく、$fs
にパイプするだけで、apacheが特定のポートをリッスンしてスクリプトを割り当てる必要があります。 それとも、
fputs($fp, "POST $path HTTP/1.0\n"); //where path is your script of course
おそらく、MIMEメール解析ライブラリを使用できます。 http://stackoverflow.com/questions/1238642/how-to-extract-mail-atachment-with-php/1240048#1240048 – Barmar
これは純粋なフォームデータです。メールヘッダーは含まれていませんが、試してみる。実際に試してみる前に、私はこれをソリューションに非常に近いと考えています。 – Vicary
私は事務所でコードを取得する前に、旧正月が終わる前に賞金が終了するので、コメントを頂きました。 – Vicary