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

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

伊谢尔伦
伊谢尔伦original
2017-06-27 13:36:29979parcourir

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>
<?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";
  }
?>

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;]
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"]);   
}
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"]);
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>
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");
     }
 }
 ?>

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

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

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"]);
Besoin

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

6553d3faa568d331c2f17b444ba28a42

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!

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