Maison > Article > développement back-end > Comment télécharger des fichiers en php [Résumé]
Comment télécharger des fichiers en PHP : 1. Obtenez le chemin du fichier à partir de "$_GET['file']" ; 2. Définissez les informations d'en-tête ; 3. Utilisez "file_get_contents()" et "file( )" ; 4. Via les méthodes "readfile" et "fopen".
Recommandé : "Tutoriel vidéo PHP"
Comment télécharger des fichiers en PHP
1. Obtenez le chemin du fichier
Obtenez le chemin du fichier à partir de $_GET['file']
$path_parts = pathinfo($_GET['file']); $file_name = $path_parts['basename']; $file_path = '/mysecretpath/' . $file_name;
Assurez-vous d'utiliser la méthode ci-dessus pour obtenir le chemin. concaténez simplement des chaînes pour obtenir le chemin.
$mypath = '/mysecretpath/' . $_GET['file'];
Si l'entrée est ../../, vous pouvez accéder à n'importe quel chemin
2 Définir les informations d'en-tête
header('Content-Description: File Transfer'); //描述页面返回的结果 header('Content-Type: application/octet-stream'); //返回内容的类型,此处只知道是二进制流。具体返回类型可参考http://tool.oschina.net/commons header('Content-Disposition: attachment; filename='.basename($file));//可以让浏览器弹出下载窗口 header('Content-Transfer-Encoding: binary');//内容编码方式,直接二进制,不要gzip压缩 header('Expires: 0');//过期时间 header('Cache-Control: must-revalidate');//缓存策略,强制页面不缓存,作用与no-cache相同,但更严格,强制意味更明显 header('Pragma: public'); header('Content-Length: ' . filesize($file));//文件大小,在文件超过2G的时候,filesize()返回的结果可能不正确
3. . La méthode file_get_contents() du fichier de sortie
file_get_contents() lit le contenu du fichier dans une chaîne, ce qui signifie lire le fichier dans la mémoire puis afficher le contenu
$str = file_get_contents($file); echo $str;
De cette façon, tant que comme le fichier est légèrement plus volumineux, il dépassera la limite de mémoire
4. La méthode file() du fichier de sortie
est similaire à file_get_contents(), sauf que file() lira le fichier. contenu dans le tableau ligne par ligne, et il doit également occuper la mémoire
$f = file($file); while(list($line, $cnt) = each($f)) { echo $cnt; }
Lorsque le fichier est volumineux, la limite de mémoire sera dépassée
Méthode Readfile() du fichier de sortie
5. 🎜>
Méthode readfile() : lire un fichier et écrire dans le tampon de sortieCette méthode peut directement sortir dans le tampon sans que l'intégralité du fichier n'occupe la mémoireLa condition préalable est d'effacer le tampon d'abord et laissez l'utilisateur voir la boîte de dialogue pour télécharger le fichier
while (ob_get_level()) ob_end_clean(); //设置完header以后 ob_clean(); flush(); //清空缓冲区 readfile($file);Cette méthode peut générer des fichiers volumineux, et la lecture d'un seul fichier ne dépassera pas la limite de mémoire, sauf dans les situations suivantes.
readfile() provoquera également un épuisement de la mémoire PHP lorsque plusieurs personnes liront le fichier : http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php- memoryPHP doit lire le fichier et écrit dans le tampon de sortie. Ainsi, pour un fichier de 300 Mo, quelle que soit l'implémentation que vous avez écrite (par plusieurs petits segments ou par 1 gros morceau), PHP doit lire 300 Mo de fichier. éventuellement le fichier.Si plusieurs utilisateurs doivent télécharger le fichier, il y aura un problème. (Sur un serveur, les fournisseurs d'hébergement limiteront la mémoire accordée à chaque utilisateur d'hébergement. Avec une mémoire aussi limitée, l'utilisation du tampon ne fonctionnera pas. être une bonne idée. )Je pense qu'utiliser le lien direct pour télécharger un fichier est une bien meilleure approche pour les gros fichiers.L'idée principale : PHP doit lire le file , puis sortie dans le tampon. Pour un fichier de 300 Mo, PHP doit encore lire 300 Mo de mémoire. Par conséquent, lorsque plusieurs utilisateurs téléchargent en même temps, le tampon manquera également de mémoire. (Veuillez me corriger si je me trompe) Par exemple, si 100 utilisateurs téléchargent, ils auront besoin de 100*buffer_size de mémoireLa méthode fopen() du fichier de sortie
set_time_limit(0); $file = @fopen($file_path,"rb"); while(!feof($file)) { print(@fread($file, 1024*8)); ob_flush(); flush(); }
fopen () peut lire des fichiers volumineux et vous pouvez spécifier une partie du contenu à lire à chaque fois. Il est également utile lors de l'exploitation de fichiers volumineux
7.Résumé
Lorsque vous utilisez PHP pour télécharger des fichiers, vous devez faire attention au scénario. Si seuls quelques petits fichiers sont téléchargés, il est préférable d'utiliser PHP pour le téléchargement ; mais si PHP doit supporter un grand nombre de demandes de téléchargement, alors le téléchargement des fichiers ne doit pas être effectué par PHP.
Pour Apache, il existe mod_xsendfile qui peut aider à terminer la tâche de téléchargement, ce qui est plus simple et plus rapide
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!