ホームページ > バックエンド開発 > PHPの問題 > ヘッダー メソッドによる PHP ダウンロード ファイルのチュートリアル

ヘッダー メソッドによる PHP ダウンロード ファイルのチュートリアル

一朵云彩
リリース: 2023-02-28 21:38:02
オリジナル
2864 人が閲覧しました

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 = &#39;&#39;,$saveFileName = &#39;&#39;,$downloadRate = 20.5)
{
	if(file_exists($localFile) && is_file($localFile)) {
		ob_clean();
		header(&#39;Cache-control: private&#39;);
		header(&#39;Content-Type: application/octet-stream&#39;); 
		header(&#39;Content-Length: &#39;.filesize($localFile));
		header(&#39;Content-Disposition: filename=&#39;.$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(&#39;Error: The file &#39;.$localFile.&#39; does not exist!&#39;);
	}
}
ログイン後にコピー

#3. ネットワーク ファイルのダウンロード

function downloadFromUrl($url = &#39;&#39;, $savePath = &#39;uploads/&#39;)
{
    set_time_limit(0);
    ini_set(&#39;max_execution_time&#39;, &#39;0&#39;);
    $pi = pathinfo($url);
    $ext = $pi[&#39;extension&#39;];
    $name = $pi[&#39;filename&#39;];

    $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 . &#39;.&#39; . $ext;
    if (preg_match("/[^0-9a-z._-]/i", $saveFile)) {
        $saveFile = $savePath . &#39;/&#39; . md5(microtime(true)) . &#39;.&#39; . $ext;
    } else {
        $saveFile = $savePath . &#39;/&#39; . $name . &#39;.&#39; . $ext;
    }

    $handle = fopen($saveFile, &#39;wb&#39;);
    if(fwrite($handle, $opt)){
        echo &#39;download success&#39;;
    }
    fclose($handle);
    exit;
}
ログイン後にコピー

4. ネットワーク ファイル サイズを取得する

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(&#39;Authorization: Basic &#39; . base64_encode("$user:$pw"));
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    curl_exec($ch);
    curl_close($ch);
    $head = ob_get_contents();
    ob_end_clean();
    $regex = &#39;/Content-Length:\s([0-9].+?)\s/&#39;;
    preg_match($regex, $head, $matches);
    return isset($matches[1]) ? $matches[1] : "unknown";
}
ログイン後にコピー

概要:

1. ヘッダー メソッドを通じてダウンロードし、ajax メソッドを通じてリクエストしないでください

2. タイムアウトを設定します

3.memory_limitを設定します

4.ヘッダーの前にOb_clean()を設定します

5.バッファサイズを設定します

6.メモリ負荷を軽減するためにsleep()を設定できます

以上がヘッダー メソッドによる PHP ダウンロード ファイルのチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート