2013-08-10 4 views
2

J'utilise le code ci-dessous pour télécharger des fichiers avec une extension autorisée de moins de 5 Mo. Mais en utilisant ce code, tout doc ou pdf etc ne télécharge pas! Par exemple: un fichier docx de 4,78 Mo ou un téléphone Windows de 1,64 Mo ne télécharge pas!Le téléchargement de fichier ne fonctionne pas pour tous les fichiers

$allowedExts = array("gif", "jpeg", "jpg","png","pdf","doc","docx","txt","rtf","bmp","psd","zip","rar","ppt","pptx"); 

$extension = end(explode(".", $_FILES["file"]["name"])); 

if (in_array($extension, $allowedExts) && $_FILES["file"]["size"]<5242880 && $_FILES["file"]["error"]<=0) { 
    $rand = rand(000,999); 
    $tempfile = $_FILES["file"]["name"]; 
    $file = $time . "=" . $rand . "=" . $tempfile; 

    if(file_exists("upload/".$file)) { 
     header("location:home.php?error=error"); 
    } else { 
     move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$file); 
    } 
} else { 
    header("location:home.php?error=error"); //this gets executed for some doc or pdf files ! 
} 
+0

Que se passe-t-il? Quelle est l'erreur? – cHao

+0

Il vous manque un '$' pour 'allowedExts' - cela pourrait-il être le problème? –

+0

Voir la valeur d'extension lors de leur remontage – Gautam3164

Répondre

3

Pour ce fichier "Holidays.docx '" il me semble que le fichier dépasse upload_max_filesize. Au moins c'est ce que l'var_dump dit au sujet de $_FILES['file']['error'] qui est égale à 1 (UPLOAD_ERR_INI_SIZE)

Vous devez Chech paramètres php.iniupload_max_filesize et post_max_size parce que c'est la limite réelle de la taille fichier peut être téléchargé sur le serveur. Par défaut upload_max_filesize = 2M, votre limite de 5 Mo ne signifie rien.

Vous pouvez également utiliser ini_get('upload_max_filesize'); pour obtenir le paramètre d'exécution.
Si vous ne savez pas où se trouve votre fichier de configuration php.ini, utilisez phpinfo().

Aussi à savoir est que PHP retournera $_FILES['file']['size'] égal à 0 si le fichier dépasse la limite de taille de fichier - ce qui est exactement ce qui s'est passé.

Donc tout fonctionne comme il se doit. Vous devriez poster plus d'informations sur var_dump() pour les autres fichiers qui ne sont pas téléchargés.

À noter également, vous ne vérifiez pas les extensions de fichiers en respectant la casse de sorte que les fichiers avec des extensions comme .DOCX ne seront pas acceptés par votre script.

+0

merci, j'ai fait des changements pour dans la comparaison insensible à la casse .... upload_max_size est 6MB & post_max_size est 8MB..la taille si la condition est passée par le fichier docx 4,78 mb (vérifié par écho) .... mais pas téléchargé & affiche le tableau 'file' => tableau 'name' => chaîne 'Holidays.docx' (longueur = 13) 'type' => chaîne '' (longueur = 0) 'tmp_name' => chaîne '' (longueur = 0) 'error' => int 1 'size' => int 0 ! – user2216267

+1

@ user2216267 hmm, c'est étrange si c'est vrai. Essayez 'var_dump (ini_get ('upload_max_filesize'));' - cela vous montrera exactement quelle est la valeur d'exécution - peut-être que php.ini que vous avez regardé n'est pas réellement utilisé –

+0

chaîne '2M' (longueur = 2)! ..comment est-il possible que le upload_max_filesize dans php.ini soit 8MB ?? – user2216267

3

Vous combinez ici trois conditions dans vos instructions if et si l'une d'elles échoue, le bloc else sera exécuté. Mais il ne vous dira pas quelle condition a échoué.

if (in_array($extension, $allowedExts) && $_FILES["file"]["size"]<5242880 && 
$_FILES["file"]["error"]<=0) { 

ici:

  • in_array($extension, $allowedExts) - de votre sortie var_dump, cela semble être correct.

  • $_FILES["file"]["error"]<=0) - c'est correct, mais vous n'avez pas besoin de vérifier si elle est moins à 0. Les erreurs vont de 1 à 8 et ne seront pas aller en dessous de 0, mais qui ne sera pas à l'origine des problèmes cependant.

  • $_FILES["file"]["size"]<5242880 - cela pourrait échouer. Vérifiez vos configurations php.ini et découvrez ce que upload_max_size est. Si elle est inférieure à la taille du fichier, la condition échouera et le bloc else sera exécuté.

À des fins de dépannage, je vous recommande de scinder les instructions if en blocs séparés. De cette façon, vous comprendrez quelle partie s'exécute et vous aidera à trouver pourquoi.

Un exemple:

$check = True; 
if (!condition) { 
    $check = False; 
} 
if (!condition) { 
    $check = False; 
} 
if (!condition) { 
    $check = False; 
} 

if ($check == True) { 
    # code... 
} 

Voici quelques autres améliorations mineures pour votre code:

Vous utilisez actuellement:

$extension = end(explode(".", $_FILES["file"]["name"])); 

pour obtenir l'extension de l'image. Cela pourrait échouer si l'extension est dans un cas différent.

Modifier ceci:

$extension = strotolower(end(explode(".", $_FILES["file"]["name"]))); 

ou mieux encore:

$extension = strtolower(pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION)); 

Deuxièmement, vous utilisez $time variable dans la déclaration suivante:

$file = $time . "=" . $rand . "=" . $tempfile; 

Ce ISN variable » t défini nulle part et PHP va lancer une erreur Undefined variable lorsque vous exécutez le s cript. Changez-le pour:

$time = time(); 
$file = $time . "=" . $rand . "=" . $tempfile; 

Espérons que cela aide!

+0

merci mais j'ai défini la variable $ time dans le même fichier .. upload_max_size est 6MB ... .the size si la condition est passée par le fichier docx 4.78 mb .... mais pas la condition d'erreur .... y a-t-il une autre fonction pour le téléchargement de fichier ou n'importe quel moyen de télécharger avec moins de restrictions? – user2216267

+0

Qu'entendez-vous par * moins de restrictions *? –

+0

Je pense que le fichier docx ne télécharge pas car il n'est peut-être pas dans un format "Standard" .... alors peut-être que cela provoque l'erreur de fichier .... ainsi est le fichier d'extension autorisée que je voulais télécharger sans un contrôle dur (parler peu généralement)? – user2216267

Questions connexes