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

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

一朵云彩
一朵云彩オリジナル
2020-05-04 14:33:552847ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。