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);
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; }
2. Limiter le taux de téléchargement
/** * @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. Télécharger des fichiers réseau
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. 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('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"; }
Résumé :
1. Le téléchargement via l'en-tête ne doit pas être demandé via ajax2 Définir le délai d'attente 3. Définissez memory_limit
4. Ob_clean() avant l'en-tête5. Définir la taille du tampon6.
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!