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);
(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; }
2. Download-Rate begrenzen/**
* @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. Netzwerkdateien herunterladen 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. Ermitteln Sie die Netzwerkdateigröße 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!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";
}