Maison  >  Article  >  développement back-end  >  Explication détaillée du téléchargement de fichiers php et plusieurs exemples de téléchargement de fichiers

Explication détaillée du téléchargement de fichiers php et plusieurs exemples de téléchargement de fichiers

伊谢尔伦
伊谢尔伦original
2017-06-24 15:09:021604parcourir

Dans le développement de programmes PHP, le Téléchargement de fichiers est une fonction très couramment utilisée et constitue également l'une des compétences nécessaires pour les programmeurs PHP. Heureusement, implémenter la fonction de téléchargement de fichiers en PHP est beaucoup plus simple que dans des langages tels que Java et C#.

Pour utiliser PHP pour implémenter la fonction de téléchargement de fichiers, nous écrivons d'abord deux fichiers php : index.php et upload.php. Parmi eux, la page index.php est utilisée pour soumettre la demande de formulaire de téléchargement de fichier, et la page upload.php est utilisée pour recevoir le fichier téléchargé et le traiter en conséquence.

Tout d'abord, écrivons un simple fichier index.php Comme il s'agit principalement de code html, c'est relativement simple, je n'entrerai donc pas dans les détails. Le code détaillé de la page index.php est. comme suit :

<?php
//设置编码为UTF-8,以避免中文乱码
header(&#39;Content-Type:text/html;charset=utf-8&#39;);
?>
<!DOCTYPE html>
<html>
<head>
  <title>文件上传表单页面</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
文件1:<input name="upload_file1" type="file" /><br/>
文件2:<input name="upload_file2" type="file" /><br/>
<input type="submit" value="上传" />
</form>
</body>
</html>

Il convient de noter que puisque le protocole HTTP a été conçu à l'origine, il ne prenait pas en charge la fonction de téléchargement de fichiers. La valeur par défaut de l'attribut encrypt du formulaire est application/x-. www-form-urlencoded, qui ne peut être utilisé que pour la soumission du formulaire général. Si le formulaire soumis contient des fichiers qui doivent être téléchargés, nous devons modifier la valeur de l'attribut enctype en multipart/form-data pour implémenter la fonction de téléchargement de fichiers. De plus, la valeur de l'attribut de méthode doit être post.

Ensuite, nous continuons à écrire le code du fichier upload.php.

<?php
//设置编码为UTF-8,以避免中文乱码
header(&#39;Content-Type:text/html;charset=utf-8&#39;);
$first_file = $_FILES[&#39;upload_file1&#39;]; //获取文件1的信息
$second_file = $_FILES[&#39;upload_file2&#39;]; //获取文件2的信息$upload_dir = &#39;D:/upload/&#39;;  //保存上传文件的目录//处理上传的文件1
if ($first_file[&#39;error&#39;] == UPLOAD_ERR_OK){
  //上传文件1在服务器上的临时存放路径
  $temp_name = $first_file[&#39;tmp_name&#39;];
  //上传文件1在客户端计算机上的真实名称
  $file_name = $first_file[&#39;name&#39;];
  //移动临时文件夹中的文件1到存放上传文件的目录,并重命名为真实名称
  move_uploaded_file($temp_name, $upload_dir.$file_name);
  echo &#39;[文件1]上传成功!<br/>&#39;;
}else{
  echo &#39;[文件1]上传失败!<br/>&#39;;
}

//处理上传的文件2
if ($second_file[&#39;error&#39;] == UPLOAD_ERR_OK){
  //上传文件2在服务器上的临时存放路径
  $temp_name = $second_file[&#39;tmp_name&#39;];
  //上传文件2在客户端计算机上的真实名称
  $file_name = $second_file[&#39;name&#39;];
  //移动临时文件夹中的文件2到存放上传文件的目录,并重命名为真实名称
  move_uploaded_file($temp_name, $upload_dir.$file_name);
  echo &#39;[文件2]上传成功!<br/>&#39;;
}else {
  echo &#39;[文件2]上传失败!<br/>&#39;;
}
?>

En PHP, lorsque la demande de formulaire soumise par le client du navigateur contient un fichier téléchargé, PHP stockera temporairement le fichier téléchargé dans un répertoire temporaire (dans les systèmes d'exploitation Windows, le répertoire temporaire par défaut est généralement C :/Windows/Temp), puis les informations pertinentes du fichier téléchargé sont stockées dans la super variable globale $_FILES. Par conséquent, il nous suffit d'obtenir les informations sur le fichier téléchargé via le tableau $_FILES, puis d'y effectuer les opérations de traitement correspondantes. Examinons ensuite les détails de l'utilisation de la fonction print_r() pour générer la super variable globale $_FILES lors du téléchargement de deux fichiers image A.gif et B.gif via le navigateur :

Array ( [upload_file1] => Array ( 
 [name] => A.gif (客户端上传时的真实文件名称)
 [type] => image/gif (文件的类型)
 [tmp_name] => C:\Windows\Temp\php9803.tmp (文件上传到PHP服务器后临时存放的路径)
 [error] => 0 (错误信息,0表示没有错误)
 [size] => 87123 (文件大小,单位为字节)
 )
    [upload_file2] => Array (
 [name] => B.gif
 [type] => image/gif
 [tmp_name] => C:\Windows\Temp\php9813.tmp
 [error] => 0
 [size] => 93111
 )
)

dans ce qui précède Dans l'exemple, les noms de paramètres des deux fichiers que nous avons téléchargés sont upload_file1 et upload_file2. Maintenant, nous laissons plusieurs fichiers du formulaire utiliser le même nom de paramètre upload_file et soumettons à nouveau les deux fichiers qui viennent d'être téléchargés sous la forme de tableaux de paramètres pour le téléchargement. À ce stade, nous devons modifier les deux champs de fichier de la page index.php par le code html suivant :

  • Fichier 1 : 99c5acea4172c2626963235971908056076402276aae5dbec7f672f8f4e5cc81

  • Fichier 2 : 794bb0a933f8b4050a03463bafc6e5b2076402276aae5dbec7f672f8f4e5cc81

De plus, nous devons également mettre à jour la page upload.php Apportez les modifications correspondantes :

<?php
//设置编码为UTF-8,以避免中文乱码
header(&#39;Content-Type:text/html;charset=utf-8&#39;);
$fileArray = $_FILES[&#39;upload_file&#39;];//获取多个文件的信息,注意:这里的键名不包含[]

$upload_dir = &#39;D:/upload/&#39;; //保存上传文件的目录
foreach ( $fileArray[&#39;error&#39;] as $key => $error) {
  if ( $error == UPLOAD_ERR_OK ) { //PHP常量UPLOAD_ERR_OK=0,表示上传没有出错
    $temp_name = $fileArray[&#39;tmp_name&#39;][$key];
    $file_name = $fileArray[&#39;name&#39;][$key];
    move_uploaded_file($temp_name, $upload_dir.$file_name);
    echo &#39;上传[文件&#39;.$key.&#39;]成功!<br/>&#39;;
  }else {
    echo &#39;上传[文件&#39;.$key.&#39;]失败!<br/>&#39;;
  }
}
?>

De même, nous utilisons la fonction print_r() pour visualiser les détails de la variable superglobale $_FILES dans l'exemple ci-dessus :

Array ( 
 [upload_file] => Array ( 
 [name] => Array ( 
  [0] => A.gif
  [1] => B.gif  
  ) 
 [type] => Array ( 
  [0] => image/gif
  [1] => image/gif  
  ) 
 [tmp_name] => Array (
  [0] => C:\Windows\Temp\php87B9.tmp
  [1] => C:\Windows\Temp\php87BA.tmp
  ) 
 [error] => Array ( 
  [0] => 0
  [1] => 0  
  ) 
 [size] => Array ( 
  [0] => 87123
  [1] => 93111  
  )
 )
)

Remarque 1 : Sous la configuration par défaut de PHP, une erreur se produira si la taille du fichier téléchargé dépasse une certaine plage. Veuillez vous référer à la solution au problème de la modification de la limite de taille des fichiers téléchargés PHP mentionnée à la fin de. l'article.
Remarque 2 : Le code PHP Traitement des fichiers téléchargé ci-dessus n'est qu'un simple exemple d'introduction et ne peut pas être utilisé directement comme code formel car il existe de nombreux facteurs de sécurité qui nécessitent une attention supplémentaire qui n'ont pas été pris en compte, tels que comme : type de fichiers, taille du fichier, noms en double des fichiers téléchargés, etc.
Remarque 3 : Si le nom du fichier téléchargé contient des caractères chinois, le nom du fichier peut être tronqué. À ce stade, vous devez utiliser la fonction iconv() pour convertir l'encodage du nom de fichier.

Auparavant, nous avons appris à utiliser PHP pour implémenter le téléchargement de fichiers et le téléchargement de plusieurs fichiers. Cependant, sous la configuration par défaut de PHP, lorsque la taille du fichier téléchargé dépasse une certaine limite, nous obtiendrons le message d'erreur suivant :

Warning: POST Content-Length of 625523488 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
上述错误信息的大致意思是,我们使用POST请求提交的数据大小超过了服务器的最大限制数(8388608字节=8MB)。

出现上述错误的原因是,在PHP的配置文件php.ini中,默认存在如下配置信息(在php.ini中,行首的分号";"表示当前行是注释,不会生效):

;脚本解析输入数据(类似 POST 和 GET)允许的最大时间,单位是秒。 它从接收所有数据到开始执行脚本进行测量的。 
max_input_time = 60

;允许客户端单个POST请求发送的最大数据
post_max_size = 8M

;是否开启文件上传功能
file_uploads = On

;文件上传的临时存放目录(如果不指定,使用系统默认的临时目录)
;upload_tmp_dir =

;允许单个请求上传的最大文件大小
upload_max_filesize = 2M

;允许单个POST请求同时上传的最大文件数量
max_file_uploads = 20

Comme nous pouvons le voir à partir des informations de configuration ci-dessus, les informations de configuration par défaut de PHP est le "coupable" qui amène le téléchargement de fichiers PHP à indiquer que la taille du fichier dépasse la limite. L'auteur a fourni les informations d'annotation chinoise correspondant à chaque option de commande dans les informations de configuration ci-dessus. Vous pouvez modifier le fichier de configuration php.ini en fonction de vos besoins réels.

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!

Déclaration:
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