2

私はfsockopenなどのPHPドキュメントを見ていましたが、ftellなどでクレイジーなことをしなければリモートファイルでfilesize()を使用できないと言われています(正確に何を言っているのかわかりません)が、私はよく考えましたどうやってするの:

$file = file_get_contents("http://www.google.com");
$filesize = mb_strlen($file) / 1000; //KBs, mb_* in case file contains unicode

これは良い方法でしょうか?当時はとてもシンプルで使い勝手が良かったようです。問題が発生したり、実際のファイルサイズにならない場合は、考えてみてください。

ちなみに、これはバイナリではなく、テキスト(Webサイト)でのみ使用したいと思います。

4

3 に答える 3

5

この回答には PHP5 と cUrl が必要です。最初にヘッダーをチェックします。Content-Length が指定されていない場合は、cUrl を使用してダウンロードし、サイズを確認します (ただし、ファイルはどこにも保存されず、一時的にメモリに保存されます)。

<?php
echo get_remote_size("http://www.google.com/");

function get_remote_size($url) {
    $headers = get_headers($url, 1);
    if (isset($headers['Content-Length'])) return $headers['Content-Length'];
    if (isset($headers['Content-length'])) return $headers['Content-length'];

    $c = curl_init();
    curl_setopt_array($c, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => array('User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3'),
        ));
    curl_exec($c);
    return curl_getinfo($c, CURLINFO_SIZE_DOWNLOAD);
}
?>
于 2010-07-15T03:54:10.507 に答える
3

get_headers()関数を見てください。HTTP リクエストから HTTP ヘッダーのハッシュを返します。ヘッダーが存在する場合、Content-lengthヘッダーは実際のコンテンツのサイズをより適切に判断できる場合があります。

そうは言っても、GET の代わりに HEAD リクエストを実行するには、 curlまたはストリームのいずれかを使用する必要があります。Content-length存在する必要があります。これにより、転送が節約されます。それはより速く、より正確になります。

于 2010-07-15T02:08:28.280 に答える
0

ファイル全体を取得し、取得したデータからファイルサイズ (文字列の長さではなく) を計算します。通常、filesize は、最初にファイル全体を読み取らずに、ファイルシステムからファイルサイズを直接伝えることができます。

そのため、これはかなり遅くなり、ファイルサイズ (文字列の長さ) を取得する前に毎回ファイル全体をフェッチします。

于 2010-07-15T01:42:17.617 に答える