Maison > développement back-end > Problème PHP > Comment télécharger des fichiers en php [Résumé]

Comment télécharger des fichiers en php [Résumé]

藏色散人
Libérer: 2023-03-04 17:34:01
original
8825 Les gens l'ont consulté

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".

Comment télécharger des fichiers en php [Résumé]

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

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

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()返回的结果可能不正确
Copier après la connexion

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

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

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 sortie

Cette méthode peut directement sortir dans le tampon sans que l'intégralité du fichier n'occupe la mémoire

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

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- memory

PHP 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émoire

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

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!

Étiquettes associées:
php
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal