http://php.net/stream_copy_to_stream $maxlength
パラメータを使用すると、コピーするバイト数を制限できます。
制限に違反したかどうかを確認する方法。ファイル全体がダウンロードされたのではありませんか?
http://php.net/stream_copy_to_stream $maxlength
パラメータを使用すると、コピーするバイト数を制限できます。
制限に違反したかどうかを確認する方法。ファイル全体がダウンロードされたのではありませんか?
Yousuf Memon のコメント (http://mattgemmell.com/2008/12/08/what-have-you-tried/) に関しては、この問題に対する私のアプローチは単純な論理です。
public function download($size_limit)
{
if($this->temp_file)
{
throw new UploadRemoteImageException('Resource has been downloaded already.');
}
$this->temp_file = tempnam(sys_get_temp_dir(), $this->temp_file_prefix);
$src = fopen($this->url, 'r');
$dest = fopen($this->temp_file, 'w+');
stream_copy_to_stream($src, $dest, $size_limit+1000);
if(filesize($dest) > $size_limit)
{
// The file size limit has been breached.
}
// [..]
}
これは、ユーザー定義の制限の上にさらにバイトを追加するだけで機能します。次に、ストリームが閉じられると、ファイルがユーザー定義のサイズ制限よりも大きいかどうかがチェックされます (これは、1000 バイトを上に追加したことが原因である可能性があります)。
ただし、チャンクサイズにも依存すると想定しているため、これが常に機能するかどうかは自信を持って言えません。