PHPでリモートファイルのファイルサイズを取得する最も簡単な方法は?
質問
cURLでヘッドリクエストを行うことを考えていましたが、これが進むべきかどうか疑問に思っていましたか?
解決
はい。ファイルはリモートであるため、 Content-Length
ヘッダーの値に完全に依存しています(ファイル全体をダウンロードする場合を除く)。 curl_setopt($ ch、CURLOPT_NOBODY、true)
および curl_setopt($ ch、CURLOPT_HEADER、true)
が必要です。
他のヒント
KISSの原則に従う最適なソリューション
$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];
curlを使用してHEADリクエストを送信するのは良い可能性があると思います。このようなことはおそらくするでしょう:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
var_dump($size);
そしてあなたを取得します:
float 3438
この方法では、ファイル全体をダウンロードするのではなく、HEADリクエストを使用しています-それでも、リモートサーバーが正しいContent-lengthヘッダーを送信することに依存しています。
考えられるもう1つのオプションは、 filesize
を使用することです。しかし、これは失敗します:ドキュメントには(quoting)と記載されています:
PHP 5.0.0以降、この関数は 一部のURLラッパーでも使用できます。 サポートされるリストを参照してください リストのプロトコル/ラッパー ラッパーがstat()をサポートする 機能のファミリー。
そして、残念ながら、 HTTPおよびHTTPSラッパー、 stat ()
はサポートされていません...
実行しようとすると、次のようなエラーが表示されます。
Warning: filesize() [function.filesize]: stat failed
for http://sstatic.net/so/img/logo.png
悪すぎる:-(
HEADリクエストを使用して Content-Length
を確認するのが標準的な方法ですが、サーバーがサポートしていない可能性があるため、一般的にこれに依存することはできません。 Content-Length
ヘッダーはオプションであり、さらにサーバーはHEADメソッドを実装しない場合があります。調査しているサーバーがわかっている場合は、それが機能するかどうかをテストできますが、一般的な解決策としては完全な証拠ではありません。
防弾ソリューションが必要ない場合は、次のようにします。
strlen(file_get_contents($url));