PHP がヘッダー メソッドを通じてファイルをダウンロードする場合、ajax メソッドを使用して送信することはできません。このメソッドはヘッダー結果を ajax に返します
(1) 大きなファイルをダウンロードする場合、長い間、PHP にはデフォルトの実行時間があり、通常は 30 秒です。この時間を超えるとダウンロードが失敗するため、タイムアウトを設定する必要があります `set_time_limit(0);`
このステートメントの説明 関数の実行ではタイムアウトは設定されません。もう 1 つ設定する必要があるのはメモリ使用量です。`ini_set('memory_limit', '128M');`
を設定するだけです。
(2) ダウンロードしたファイルをダウンロードすると、ファイル名が文字化けすることがあります。もちろん、ファイル名に中国語や特殊文字が含まれている場合にこの状況が発生します。このとき、ヘッダーを設定できます:
$contentDispositionField = 'Content-Disposition: attachment; ' . sprintf('filename="%s"; ', basename($file)) . sprintf("filename*=utf-8''%s", basename($file)); header($contentDispositionField);
(3) ダウンロード バッファ サイズ。これはサーバーの帯域幅に応じて設定できます。通常は 4096 で十分です
(4) ダウンロード時、エコー バッファの後に sleep(1) を設定できます。プログラムをスリープさせます
(5) ヘッダーを設定する前に、ob_clean() を使用してキャッシュの内容をクリアします
#1. ローカル ファイルの強制ダウンロード
function forceDownload($file = '') { set_time_limit(0); //超时设置 ini_set('memory_limit', '128M'); //内存大小设置 ob_clean(); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); $contentDispositionField = 'Content-Disposition: attachment; ' . sprintf('filename="%s"; ', basename($file)) . sprintf("filename*=utf-8''%s", basename($file)); //处理文件名称 header($contentDispositionField); header("Content-Transfer-Encoding: binary"); header("Content-Length: " . filesize($file)); $read_buffer = 4096; //设置buffer大小 $handle = fopen($file, 'rb'); //总的缓冲的字节数 $sum_buffer = 0; //只要没到文件尾,就一直读取 while (!feof($handle) && $sum_buffer < filesize($file)) { echo fread($handle, $read_buffer); $sum_buffer += $read_buffer; } //关闭句柄 fclose($handle); exit; }
2. ダウンロード速度の制限
/** * @param $localFile 本地文件 * @param $saveFileName 另存文件名 * @param $downloadRate 下载速率 */ function download_with_limitRate($localFile = '',$saveFileName = '',$downloadRate = 20.5) { if(file_exists($localFile) && is_file($localFile)) { ob_clean(); header('Cache-control: private'); header('Content-Type: application/octet-stream'); header('Content-Length: '.filesize($localFile)); header('Content-Disposition: filename='.$saveFileName); flush(); // 打开文件流 $file = fopen($localFile, "r"); while(!feof($file)) { // 发送当前块到浏览器 print fread($file, round($downloadRate * 1024)); // 输出到浏览器 flush(); // sleep one second sleep(1); } //关闭文件流 fclose($file);} else { die('Error: The file '.$localFile.' does not exist!'); } }
#3. ネットワーク ファイルのダウンロード function downloadFromUrl($url = '', $savePath = 'uploads/')
{
set_time_limit(0);
ini_set('max_execution_time', '0');
$pi = pathinfo($url);
$ext = $pi['extension'];
$name = $pi['filename'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$opt = curl_exec($ch);
curl_close($ch);
$saveFile = $name . '.' . $ext;
if (preg_match("/[^0-9a-z._-]/i", $saveFile)) {
$saveFile = $savePath . '/' . md5(microtime(true)) . '.' . $ext;
} else {
$saveFile = $savePath . '/' . $name . '.' . $ext;
}
$handle = fopen($saveFile, 'wb');
if(fwrite($handle, $opt)){
echo 'download success';
}
fclose($handle);
exit;
}
4. ネットワーク ファイル サイズを取得する 概要: 1. ヘッダー メソッドを通じてダウンロードし、ajax メソッドを通じてリクエストしないでください 2. タイムアウトを設定します 3.memory_limitを設定します 4.ヘッダーの前にOb_clean()を設定します 5.バッファサイズを設定します 6.メモリ負荷を軽減するためにsleep()を設定できます 以上がヘッダー メソッドによる PHP ダウンロード ファイルのチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。function remote_filesize($url, $user = "", $pw = "")
{
ob_start();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
if (!empty($user) && !empty($pw)) {
$headers = array('Authorization: Basic ' . base64_encode("$user:$pw"));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
curl_exec($ch);
curl_close($ch);
$head = ob_get_contents();
ob_end_clean();
$regex = '/Content-Length:\s([0-9].+?)\s/';
preg_match($regex, $head, $matches);
return isset($matches[1]) ? $matches[1] : "unknown";
}