Maison > développement back-end > tutoriel php > Résumé des problèmes de téléchargement de fichiers php

Résumé des problèmes de téléchargement de fichiers php

伊谢尔伦
Libérer: 2023-03-11 16:12:01
original
1023 Les gens l'ont consulté

Résumons plusieurs problèmes souvent rencontrés lors du téléchargement de fichiers en PHP. Vous n'avez pas besoin de les rechercher lorsque vous les utiliserez à l'avenir.

1. Créez d'abord le fichier de téléchargement le plus simple

 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>
 <body>
 <form action="upload_file.php" method="post"
 enctype="multipart/form-data">
 <label for="file">Filename:</label>
 <input type="file" name="file" id="file" /> 
 <br />
 <input type="submit" name="submit" value="Submit" />
 </form>
 </body>
 </html>
Copier après la connexion
<?php
if (($_FILES["file"]["size"] < 20000)
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    } 
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
    if (
file_exists
("upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>
Copier après la connexion

2. Ensuite, comprenez la super variable globale $_FILES Values<. 🎜>

$_FILES[&#39;userfile&#39;][&#39;name&#39;]
$_FILES[&#39;userfile&#39;][&#39;type&#39;]
$_FILES[&#39;userfile&#39;][&#39;size&#39;]
$_FILES[&#39;userfile&#39;][&#39;tmp_name&#39;]
$_FILES[&#39;userfile&#39;][&#39;error&#39;]
Copier après la connexion
Parmi eux, toutes les valeurs de $_FILES['userfile']['error'] :

UPLOAD_ERR_OK dont la valeur est 0, aucune erreur ne s'est produite,

Fichier téléchargé avec succès.

UPLOAD_ERR_INI_SIZE Sa valeur est 1 et le fichier téléchargé dépasse la valeur limitée par l'option upload_max_

filesize dans php.ini.

UPLOAD_ERR_FORM_SIZE Avec une valeur de 2, la taille du fichier téléchargé dépasse la valeur spécifiée par l'option MAX_FILE_SIZE dans le formulaire HTML.

UPLOAD_ERR_PARTIAL Sa valeur est 3, le fichier n'est que partiellement téléchargé.

UPLOAD_ERR_NO_FILE Sa valeur est 4, aucun fichier n'a été téléchargé.

UPLOAD_ERR_NO_TMP_DIR a une valeur de 6 et le dossier temporaire est introuvable. Introduit dans PHP 4.3.10 et PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE Sa valeur est 7, l'écriture du fichier a échoué. Introduit dans PHP 5.1.0.

3. De nombreuses situations : le type de fichier téléchargé doit être strictement jugé

Nous savons qu'utiliser $_FILES['userfile']['type'] pour juger le type de fichier téléchargé est une approche très imprudente, car le jugement est basé sur le suffixe du fichier. N'importe qui peut changer le suffixe d'un fichier mp3 en jpg et le télécharger déguisé en image. recommande d'utiliser l'extension PHP php_

fileinfoPour déterminer le mime du fichier, il existe de nombreuses façons d'activer l'expansion sur Baidu, qui sont légèrement différentes entre Win et Linux.

4. Scénario 1 :

Renommer automatiquement après avoir téléchargé un fichier du même nom

if (file_exists("./upload/" . $_FILES["file"]["name"]))  
{    
   do{  
       $suffix ="";  
       $suffix_length = 4;  
       $str = "0123456789abcdefghijklmnopqrstuvwxyz";  
       $len = strlen($str)-1; 
       //文件名后追加4个随机字符  
       for($i=0 ; $i<$suffix_length; $i++){  
          $suffix .= $str[rand(0,$len)];  
       }  
       $upload_filename = $_FILES[&#39;file&#39;][&#39;name&#39;];                                            
       $filename = substr($upload_filename,0,strrpos($upload_filename,".")).$suffix.".".substr($upload_filename,strrpos($_FILES["file"]["name"],".")+1); 
   }while(file_exists("./upload/".$filename));  
       move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $filename);  
}else{  
       move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);   
}
Copier après la connexion
5. date

6. Scénario 3 :
$structure = &#39;./&#39;.date("Y").&#39;/&#39;.date("m").&#39;/&#39;.date("d").&#39;/&#39;;
if (!mkdir($structure, 0777, true)) {
    die(&#39;Failed to create folders...&#39;);
}
move_uploaded_file($_FILES["file"]["tmp_name"],$structure . $_FILES["file"]["name"]);
Copier après la connexion
Téléchargement de plusieurs fichiers

<form action="" method="post" enctype="multipart/form-data">
 <p>Pictures:
 <input type="file" name="pictures[]" />
 <input type="file" name="pictures[]" />
 <input type="file" name="pictures[]" />
 <input type="submit" value="Send" />
 </p>
 </form>
Copier après la connexion
Dans certains cas, la structure variable de plusieurs fichiers est pas bon. Utilisation :
 <?php
 foreach ($_FILES["pictures"]["error"] as $key => $error) {
     if ($error == UPLOAD_ERR_OK) {
         $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
         $name = $_FILES["pictures"]["name"][$key];
         move_uploaded_file($tmp_name, "data/$name");
     }
 }
 ?>
Copier après la connexion

Dans de nombreux cas, nous avons besoin d'une structure comme celle-ci
array(1) {
    ["upload"]=>array(2) {
        ["name"]=>array(2) {
            [0]=>string(9)"file0.txt"
            [1]=>string(9)"file1.txt"
        }
        ["type"]=>array(2) {
            [0]=>string(10)"text/plain"
            [1]=>string(10)"text/html"
        }
    }
}
Copier après la connexion

L'utilisation de la fonction suivante peut facilement convertir la structure
array(1) {
    ["upload"]=>array(2) {
        [0]=>array(2) {
            ["name"]=>string(9)"file0.txt"
            ["type"]=>string(10)"text/plain"
        },
        [1]=>array(2) {
            ["name"]=>string(9)"file1.txt"
            ["type"]=>string(10)"text/html"
        }
}
}
Copier après la connexion

7 . Parfois :
function perse_array($vector) { 
     $result = array(); 
     foreach($vector as $key1 => $value1) 
         foreach($value1 as $key2 => $value2) 
             $result[$key2][$key1] = $value2; 
     return $result; 
 } 
 $upload = perse_array($_FILES["upload"]);
Copier après la connexion
Besoin

Configurer le serveurModifier la taille maximale du fichier de téléchargementD'abord, sur le formulaire

peut limiter la taille du fichier de téléchargement (peut être contourné).


Ensuite, vous devez également ajuster la configuration sur le serveur

php.ini :

max_execution_time = 30 Le temps maximum d'exécution de chaque script, en secondes

max_input_time = 60. Le temps que chaque script peut consommer, l'unité est également en secondes

memory_limit = 128M, c'est la mémoire maximale consommée par le script en cours d'exécution
post_max_size = 8M, les données maximales pour la soumission du formulaire sont de 8M, cet élément ne limite pas le téléchargement d'un seul fichier. La taille est limitée aux données soumises pour l'ensemble du formulaire.
upload_max_filesize = 2M, la taille maximale autorisée des fichiers téléchargés

nginx :

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