Tutoriel de téléchargement de fichiers PHP via la méthode d'en-tête

一朵云彩
Libérer: 2023-02-28 21:38:02
original
2835 Les gens l'ont consulté

Lorsque PHP télécharge des fichiers via la méthode d'en-tête, ils ne peuvent pas être soumis en utilisant la méthode ajax. Cette méthode renverra les résultats de l'en-tête à ajax

(1) Lors du téléchargement de fichiers volumineux, il est généralement nécessaire de Pendant longtemps, PHP a un temps d'exécution par défaut, qui est généralement de 30 s. S'il dépasse ce temps, le téléchargement échoue, vous devez donc définir un délai d'attente `set_time_limit(0);`

Cette déclaration. indique que le délai d'attente n'est pas défini pour l'exécution de la fonction. Une autre chose qui doit être définie est l'utilisation de la mémoire, il suffit de définir `ini_set('memory_limit', '128M');`.

(2) Le nom du fichier téléchargé peut être tronqué lors du téléchargement. Bien entendu, cette situation se produit lorsque le nom du fichier contient des caractères chinois ou spéciaux. Dans ce cas, vous pouvez définir l'en-tête :

$contentDispositionField = 'Content-Disposition: attachment; '
                    . sprintf('filename="%s"; ', basename($file))      
                    . sprintf("filename*=utf-8''%s", basename($file));   
header($contentDispositionField);
Copier après la connexion

(3) Taille du tampon de téléchargement, elle peut être définie en fonction de la bande passante du serveur, généralement 4096 suffit

(4) Lors du téléchargement, vous pouvez définir sleep(1) après le tampon d'écho sur laissez le programme dormir

(5) Avant de définir l'en-tête, utilisez ob_clean() pour vider le contenu du cache

Forcer le téléchargement des fichiers locaux

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;
}
Copier après la connexion

2. Limiter le taux de téléchargement

/**
 * @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;);
	}
}
Copier après la connexion

3. Télécharger des fichiers réseau

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;
}
Copier après la connexion

4. Obtenez la taille du fichier réseau

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";
}
Copier après la connexion

Résumé :

1. Le téléchargement via l'en-tête ne doit pas être demandé via ajax

2 Définir le délai d'attente

3. Définissez memory_limit

4. Ob_clean() avant l'en-tête

5. Définir la taille du tampon

6.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal