Problème d'upload de fichier (PHP)

Thomas38340 Messages postés 200 Statut Membre -  
 Utilisateur anonyme -
Bonjour, aujourd'hui j'ai un petit problème qui s'avère assez coriace et qui est le suivant :
J'ai fait un script d'upload de fichier, mais celui ci ne veut pas se stocker dans le dossier cible ! Apparemment ça serait un problème d'écriture au moment du move_uploaded_file (temp -> dossier)... Je vous laisse tout ça :


<?php
if (isset($_FILES))
{ $UploadFolder = 'images';
foreach ($_FILES as $FileArray)
{ $FileName = basename($FileArray['name']);
$FileName = strtr($FileName, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$FileName = preg_replace('/([^.a-z0-9]+)/i', '-', $FileName);
$FileMaxSize = 10*1024*1024; $FileError = "";
$FileSize = filesize($FileArray['tmp_name']);
$FilesExts = array('.png', '.gif', '.jpg', '.jpeg', '.bmp');
$FileExt = strrchr($FileArray['name'], '.');
if (!in_array($FileExt, $FilesExts)) { $FileError = 'Erreur : Seuls png, gif, jpg, jpeg et bmp sont acceptés...'; }
if ($FileSize > $FileMaxSize) { $FileError = 'Erreur : Le fichier est trop gros...'; }
if ($FileArray['name'] != 0) { $FileError = 'Erreur : Echec de l\'envoi vers le serveur.'; }
if ($FileError == "" && is_uploaded_file($FileArray['tmp_name']))
{ if(move_uploaded_file($FileArray['tmp_name'], "$UploadFolder/$FileName"))
{ $FileError = 'Résultat : Upload effectué avec succès !'; }
else { $FileError = 'Erreur : Echec de l\'enregistrement !'; } }
else { $FileError = 'Erreur : Echec de l\'enregistrement temporaire !'; }
}
}
if (isset($FileError)) echo "<p style='color:red;'><b>$FileError</b>";
?>
<form method="POST" action="uploadpictures.php" enctype="multipart/form-data" style="text-align:center;">
<input type="hidden" name="MAX_FILE_SIZE" value="10485760">
<input type="file" name="picture" style="background-color:#006699; font-weight: bold;border: none; padding:6px; margin-right:10px; border-radius:5px;"><br/>
<input type="reset" name="supprimer" value="Supprimer" >
<input type="submit" name="envoyer" value="Envoyer" >
</form>


PS : Je suis hebergé chez SFR si cela pourrait être un de leurs problème.

Merci d'avance :)
A voir également:

12 réponses

Utilisateur anonyme
 
Bonjour

Apparemment ça serait un problème d'écriture au moment du move_uploaded_file
1 - Qu'est-ce qui te fait dire ça ? Le fait de voir le message 'Erreur : Echec de l\'enregistrement !'
Tel qu'est écrit ton script, chaque message d'erreur écrase le précédent, c'est à dire que tu continues les tests même si les précédents ont échoué. Normal que tu voies le dernier de la liste
2 - pourquoi faire une boucle foreach ($_FILES as $FileArray) alors que ton formulaire n'a qu'un seul champ file ?
3 - Ajoute "print_r ($_FILES);" au début de ton script por voir ce que tu reçois vraiment.
0
Thomas38340 Messages postés 200 Statut Membre 2
 
On l'a testé et le problème vient bel et bien lors du déplacement, c'est certain : on avait mit le print_r($_FILES); et on avait eu tout ce qui n'allait pas.
Pour le foreach, j'ai oublié de remettre les plusieurs champs :/


Pour le print_r($_FILES); :

Array ( [picture] => Array ( [name] => 213300.png [type] => image/png [tmp_name] => /tmp/phpQCNDyX [error] => 0 [size] => 9189 ) )

Erreur : Echec de l'enregistrement temporaire !
0
ajp55 Messages postés 482 Statut Membre 23
 
esssaye d'arreter ton script lorsque tu affiche un message d'erreur, il est probable que l'erreur se trouve ailleurs, et toi tu n'affiche que le dernier.
essaye d'utiliser ces codes d'erreur.
UPLOAD_ERR_OK = 0
UPLOAD_ERR_INI_SIZE  = 1
UPLOAD_ERR_FORM_SIZE = 2
UPLOAD_ERR_PARTIAL = 3
UPLOAD_ERR_NO_FILE = 4
0
Thomas38340 Messages postés 200 Statut Membre 2
 
Je suis CER-TAIN que l'erreur est là !

Pour vous le montrer, j'ai d'ailleurs exactement le même problème sur ces scripts préfaits et qui normalement devraient marcher :

https://antoine-herault.developpez.com/tutoriels/php/upload/
https://apprendre-php.com/tutoriels/tutoriel-17-uploader-des-images-sur-un-serveur-web.html

Je précise que je suis en 777 pour le FTP.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
Je suis CER-TAIN que l'erreur est là !
Regarde ton programme
Si tu as le message Erreur : Echec de l'enregistrement temporaire ! ce N'EST PAS un échec de move_uploaded_file mais un échec du test if ($FileError == "" && is_uploaded_file($FileArray['tmp_name']))
Tu as donc très probablement déjà un message d'erreur, mais tu l'écrases comme on te l'a déjà dit.
0
Thomas38340 Messages postés 200 Statut Membre 2
 
Le script marche pas chez SFR mais il marche chez franceserv donc il y a bien AUCUNE erreur dans le script !
0
Utilisateur anonyme
 
Le php étant très permissif, il y a des tonnes de scripts qui tournent avec des erreurs.

Mais pour l'instant personne ne dit qu'il y a une erreur dans le script.
Je dis simplement que ton message Erreur : Echec de l'enregistrement temporaire ! N'EST PAS provoqué par un problème de move_uploaded_file, car il est dans le else de if ($FileError == "" && is_uploaded_file($FileArray['tmp_name']))
Donc de deux choses l'une :
1 - il y avait déjà un message d'erreur au moment de ce if, et on ne sait pas lequel parce que tu l'écrases avec ton nouveau message d'erreur
2 - is_uploaded_file($FileArray['tmp_name']) te rend false

Juste avant le if ($FileError == "" && is_uploaded_file($FileArray['tmp_name'])) , ajoute donc un echo '*',$FileError,'*';
0
Thomas38340 Messages postés 200 Statut Membre 2
 
Bien, il y a deux types de situations maintenant avec deux types d'erreur :

Le fichier uploadé nommé : "2222" me renvoi ceci :

Array ( [picture] => Array ( [name] => 2222.png [type] => image/png [tmp_name] => /tmp/phpIyJ1TT [error] => 0 [size] => 6000 ) ) **

Erreur : Echec de l'enregistrement !


Ainsi que les autres testé : "bubka" "BUBKA" "BUBKA 2" "bubka 2" "bubka2" me renvoient ceci :

Array ( [picture] => Array ( [name] => bubka2.png [type] => image/png [tmp_name] => /tmp/phpURA6l3 [error] => 0 [size] => 6000 ) ) *
Erreur : Echec de l'envoi vers le serveur.*

Erreur : Echec de l'envoi vers le serveur.
Erreur : Echec de l'enregistrement temporaire !
0
Utilisateur anonyme
 
Le premier cas correspond bien à un problème de move_uploaded_file.
Pas les autres.

Cette ligne
if ($FileArray['name'] != 0) { $FileError = 'Erreur : Echec de l\'envoi vers le serveur.'; } 

est clairement une erreur. il faudrait tester $FileArray['name'] != ''.
Je me demande bien pourquoi il y a une différence entre un fichier dont le nom n'est fait que de chiffre et les autres - mais on va trouver.

Question bête : le dossier images est-il bien créé ? Est-ce bien un sous-dosssier de celui qui contient le script ?
Je te propose aussi d'ajouter un echo "$UploadFolder/$FileName" juste avant le move_uploaded_file
0
Utilisateur anonyme
 
Visiblement, la comparaison entre une chaîne et un nombre utilise le début de la chaîne si elle commence par des chiffres. Ceci explique bien la différence de comportement entre les deux cas. Mais Le comportement était très certainement le même déjà chez franceserv.
As-tu fait un un echo "$UploadFolder/$FileName" juste avant le move_uploaded_file ?
0
Thomas38340 Messages postés 200 Statut Membre 2
 
Le script ressemble maintenant à cela :

<?php
print_r($_FILES);
if (isset($_FILES))
{ $UploadFolder = 'images';
foreach ($_FILES as $FileArray)
{ $FileName = basename($FileArray['name']);
$FileName = strtr($FileName, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$FileName = preg_replace('/([^.a-z0-9]+)/i', '-', $FileName);
$FileMaxSize = 10*1024*1024; $FileError = "";
$FileSize = filesize($FileArray['tmp_name']);
$FilesExts = array('.png', '.gif', '.jpg', '.jpeg', '.bmp');
$FileExt = strrchr($FileArray['name'], '.');
if (!in_array($FileExt, $FilesExts)) { $FileError = $FileError .'<br/> Erreur : Seuls png, gif, jpg, jpeg et bmp sont acceptés...'; }
if ($FileSize > $FileMaxSize) { $FileError = $FileError .'<br/> Erreur : Le fichier est trop gros...'; }
if ($FileArray['name'] != '') { $FileError = $FileError .'<br/> Erreur : Echec de l\'envoi vers le serveur.'; }
if ($FileError == "" && is_uploaded_file($FileArray['tmp_name']))
{ echo "$UploadFolder/$FileName";
if(move_uploaded_file($FileArray['tmp_name'], "$UploadFolder/$FileName"))
{ $FileError = $FileError .'<br/> Résultat : Upload effectué avec succès !'; }
else { $FileError = $FileError .'<br/> Erreur : Echec de l\'enregistrement !'; } }
else { $FileError = $FileError .'<br/> Erreur : Echec de l\'enregistrement temporaire !'; }
}
}
if (isset($FileError)) echo "<p style='color:red;'><b>$FileError</b>";
?>


Cette erreur s'affiche maintenant pour tout les fichiers :

Array ( [picture] => Array ( [name] => bubka2.png [type] => image/png [tmp_name] => /tmp/phpK9gUyd [error] => 0 [size] => 6000 ) )

Erreur : Echec de l'envoi vers le serveur.
Erreur : Echec de l'enregistrement temporaire !

Apparemment le echo "$UploadFolder/$FileName"; n'a rien affiché, j'ai même essayé de le placer chaque ligne de code plus haut mais rien ne s'affiche...
Oui, j'ai bien un dossier "images" qui est au même niveau que celui du fichier php.

Pour parler plus facilement, j'ai Skype si tu veux !
0
Utilisateur anonyme
 
Bien sûr que echo "$UploadFolder/$FileName"; n'affiche rien, puisque tu as l'erreur Erreur : Echec de l'envoi vers le serveur. .

Cette erreur est due au test if ($FileArray['name'] != '') . Il fallait écrire if ($FileArray['name'] == '') . C'est si le nom est vide qu'il y a un problème, pas l'inverse. Tu as le droit de vérifier ce que j'écris avant de le recopier.

Maintenant, tu vas tomber sur le vrai problème, celui du move_uploaded_file.

Je n'ai pas Skype
0