1

curl を使用して、データ ストリームの 1 つのチャンクだけを読み取ろうとしています。

理想的には、ストリームの最初の画像を取得して、それを jpg ファイルに書き込みたいと思います。

WRITEFUNCTION を使用してこれを実行しようとしており、ストリームの長さが 20000 を超える場合は -1 を返します。

function receiveResponse($ch,$string) {
    $length = strlen($string);
    if($length >= 20000) { return -1; }
    return $length;
}

$ch = curl_init('http://<url>/videostream.cgi');
curl_setopt($ch, CURLOPT_USERPWD, '<user>:<password>');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, "receiveResponse");
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_exec($ch);

ただし、ストリームはファイルへの書き込みを続行するため、ファイルサイズがどんどん大きくなります。

私はひどく間違ったことをしていますか?

よろしく、

4

2 に答える 2

1

このマニュアルのオプションの説明を見てみましょうhttp://www.php.net/manual/en/function.curl-setopt.php :

CURLOPT_WRITEFUNCTION コールバック関数が 2 つのパラメータを取るコールバック関数の名前。1 つ目は cURL リソースで、2 つ目は書き込むデータを含む文字列です。このコールバック関数を使用してデータを保存する必要があります。書き込まれた正確なバイト数を返す必要があります。そうでない場合、転送はエラーで中止されます。

つまり、応答を複数のデータに分割できることを意味します。最初の 20000 バイトを適切に受信するには、$full_length カウンターを追加する必要があります。

$full_length = 0;
function receiveResponse($ch,$string) use (&$full_length) {
    $length = strlen($string);
    $full_length += $length;
    if($full_length >= 20000) { return -1; }
    return $length;
}
于 2012-08-11T11:44:30.993 に答える
-2

これをコメントしてみてください curl_setopt($ch, CURLOPT_FILE, $fh);

于 2011-10-19T08:01:07.820 に答える