Heim > Backend-Entwicklung > PHP-Problem > Tutorial zum Herunterladen von PHP-Dateien über die Header-Methode

Tutorial zum Herunterladen von PHP-Dateien über die Header-Methode

一朵云彩
Freigeben: 2023-02-28 21:38:02
Original
2862 Leute haben es durchsucht

Wenn PHP Dateien über die Header-Methode herunterlädt, können sie nicht mit der Ajax-Methode übermittelt werden. Diese Methode gibt die Header-Ergebnisse an Ajax zurück

(1) Beim Herunterladen großer Dateien, Dies ist normalerweise erforderlich. PHP hat eine Standardausführungszeit, die normalerweise 30 Sekunden beträgt. Wenn diese Zeit überschritten wird, schlägt der Download fehl, sodass Sie ein Timeout festlegen müssen `set_time_limit(0);`

Diese Anweisung zeigt an, dass das Timeout für die Funktionsausführung nicht festgelegt ist. Eine weitere Sache, die eingestellt werden muss, ist die Speichernutzung. Stellen Sie einfach `ini_set('memory_limit', '128M');` ein.

(2) Der Dateiname der heruntergeladenen Datei kann beim Herunterladen verstümmelt sein. Diese Situation tritt natürlich auf, wenn der Dateiname chinesische Zeichen oder Sonderzeichen enthält. In diesem Fall können Sie den Header festlegen:

$contentDispositionField = 'Content-Disposition: attachment; '
                    . sprintf('filename="%s"; ', basename($file))      
                    . sprintf("filename*=utf-8''%s", basename($file));   
header($contentDispositionField);
Nach dem Login kopieren

(3) Download-Puffergröße, diese kann entsprechend der Serverbandbreite eingestellt werden, im Allgemeinen reicht 4096 aus

(4) Beim Herunterladen können Sie Sleep(1) nach dem Echopuffer auf einstellen Lassen Sie das Programm schlafen 🎜>

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;
}
Nach dem Login kopieren

2. Download-Rate begrenzen

/**
 * @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;);
	}
}
Nach dem Login kopieren

3. Netzwerkdateien herunterladen

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;
}
Nach dem Login kopieren

4. Ermitteln Sie die Netzwerkdateigröße

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";
}
Nach dem Login kopieren

Zusammenfassung:

1 Das Herunterladen über den Header darf nicht über Ajax angefordert werden

2. Timeout festlegen 3. Legen Sie „memory_limit“ fest 4. Ob_clean() vor dem Header

5. Legen Sie die Puffergröße fest

6

Das obige ist der detaillierte Inhalt vonTutorial zum Herunterladen von PHP-Dateien über die Header-Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage