[RESOLU] ckeditor en local ne peut télécharger image

Mammouth du PHP | 810 Messages

28 janv. 2016, 01:56

Bonjour,

J'ai perdu des heures à tenter de trouver la solution en local, de peur que le service en ligne ne fût bloqué, mais en vain. En local, ça ne fonctionne pas, en ligne tout va bien.

Voilà, j'utilise ckeditor dans le cadre de mon site web.
Cet éditeur de texte simple permet d'insérer des images et l'icône d’insertion d'image permet en même d'en téléverser une nouvelle sur le serveur.

En ligne (serveur de production), tout va bien. Le système amène l'usager à son sous-répertoire, lui présente les images déjà là, lui offre de téléverser et le téléversement fonctionne très bien.

En local (serveur de développement), les fenêtres apparaissent et donnent l'impression que tout va bien. Mon script de gestion des téléversements est bien lancé, mais reçoit des valeurs nulles, voici le contenu de la variable $_FILES

Code : Tout sélectionner

array(1) { ["upload"]=> array(5) { ["name"]=> string(26) "AeroportPresCHUL_1937.jpeg" ["type"]=> string(0) "" ["tmp_name"]=> string(0) "" ["error"]=> int(3) ["size"]=> int(0) } }
Mon critère d'action

Code : Tout sélectionner

if($_FILES["size"] > 0) { blabla }
est donc toujours faux.
Le code d'erreur, faut-il comprendre compte trois chiffres, mais quelle est sa valeur?

Je vu que mon répertoire de fichier temporaire n'était pas défini dans apache2.
Je l'ai défini et j'ai redémarré le serveur. phpinfo() me donne l'information correcte.

Auriez-vous d'autres pistes ?

Merci.
Soyez artisans de paix

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7160 Messages

28 janv. 2016, 10:40

Vérifie les logs de ton serveur (cf phpinfo pour savoir où est stocké le fichier de log)
Ça peut venir d'un problème de droit où l'user qui fait tourner apache n'a pas les droits en écriture dans le répertoire d'upload.
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7160 Messages

28 janv. 2016, 10:44

D'autres pistes :
- Regarde le contenu de la variable error : http://www.php.net/manual/en/features.f ... errors.php
- Et surtout je pense que ton if est incorrect : $_FILES est un tableau qui contient DES fichiers uploadés et pour chacun des fichiers les infos relative à celui ci (dont size)
Ici tu as oublié le nom du champ, ça devrait mieux marcher comme ça :
if($_FILES["upload"]["size"] > 0) { blabla }
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 810 Messages

28 janv. 2016, 16:30

Merci @rthur,

Mon log apache ne révèle rien:

Code : Tout sélectionner

127.0.0.1 - - [28/Jan/2016:09:12:23 -0500] "POST /MesSites/rcmission/plongee/outils/ckeditor_RecevoirImage.php?CKEditor=Details&CKEdit$ 1
Rien dans le log apache2/error.log non plus
D'ailleurs j'ai donné à mon répertoire de téléchargement temporaire les droits 777 pour être sûr que ça passe.

Quant à $_FILES... c'est une faute de copie que j'avais faite ici. Voici le vrai code

Code : Tout sélectionner

if ($_FILES["upload"]['size'] > 0 && isset($NumMbre) ) { blabla }
Voici la piste que j'explore maintenant : http://www.php.net/manual/fr/features.f ... errors.php
Merci, je ne la connaissais pas.
Voici le résultat de

Code : Tout sélectionner

var_dump($_FILES['upload']['error']); int(3) Ceci qui veut dire UPLOAD_ERR_PARTIAL
Valeur : 3. Le fichier n'a été que partiellement téléchargé.

Je ne suis pas plus avancé.


As-tu d'autres bonnes idées? Je les essayerai toutes.
Soyez artisans de paix

Mammouth du PHP | 810 Messages

28 janv. 2016, 16:39

Voici une nouvelle version du code:

Code : Tout sélectionner

if ($_FILES["upload"]['size'] > 0 && isset($NumMbre) && $_FILES['upload']['error'] == 0 ) { blabla } else { $MsgErr = array("aucune", "La taille du fichier téléchargé excède la valeur maximale permise par le serveur", "La taille du fichier téléchargé excède la valeur permise par le formulaire", "Le fichier n'a été que partiellement téléchargé.", "Aucun fichier n'a été téléchargé.", "Le dossier temporaire de téléchargement n`a pas été défini.", "Échec de l'écriture du fichier sur le disque.", "Le serveur a arrêté l'envoi de fichier." ); echo '<script>alert("Une erreur s`est produite.\n'.$MsgErr[$_FILES['upload']['error']].'");</script>'; }
et oui, ça m'ouvre bien une fenêtre qui dit téléchargement partiel.
Soyez artisans de paix

Mammouth du PHP | 810 Messages

28 janv. 2016, 16:51

Selon,
http://stackoverflow.com/questions/2547 ... y-uploaded
une erreur 3 serait due à :
As php documentation says, this error is

UPLOAD_ERR_PARTIAL is given when the mime boundary is not found after the file data.
A possibly cause for this is that the upload was cancelled by the user (pressed ESC, etc).

Also there are some more variants to check:
Permissions are wrong (i doubt, cause it will break all users).
Not enough free space on server.
This error occures when uploading from iOS.
This error can occure when uploading folder (due to browser limitations). On Mac OSX it occures 100%.

So this is possible errors to check. Hope this will help.
Je mise sur les permissions.

phpinfo() me donne:
file_uploads On On
max_file_uploads 20 20 //Nombre de fichiers
upload_max_filesize 2M 2M
upload_tmp_dir /var/www/tmp /var/www/tmp
Mon répertoire /var/www/tmp est totalement ouvert: permissions 777
Peut-être devrais-je définir un autre répertoire de téléchargement en php.
Comment connaître le répertoire actuellement utilisé?

Merci de lire tout ça!
Soyez artisans de paix

Mammouth du PHP | 810 Messages

28 janv. 2016, 16:56

J'ai consulté http://php.net/manual/fr/function.sys-get-temp-dir.php

et modifié mon code en ceci:

Code : Tout sélectionner

$temp_file = addslashes(sys_get_temp_dir()); $MsgErr = array("aucune", "La taille du fichier téléchargé excède la valeur maximale permise par le serveur", "La taille du fichier téléchargé excède la valeur permise par le formulaire", "Le fichier n'a été que partiellement téléchargé\n Vérifiez ".$temp_file.".", "Aucun fichier n'a été téléchargé.", "Le dossier temporaire de téléchargement n`a pas été défini.", "Échec de l'écriture du fichier sur le disque.", "Le serveur a arrêté l'envoi de fichier." ); echo '<script>alert("Une erreur s`est produite.\n'.$MsgErr[$_FILES['upload']['error']].'");</script>';
Mais voilà, mon popup n'ouvre plus.
Dès que je retire

Code : Tout sélectionner

".$temp_file."
mon popup fonctionne de nouveau.


Me voici sur une piste

Code : Tout sélectionner

echo addslashes(sys_get_temp_dir());
me retourne:
/tmp
Notice: Undefined variable: temp_file in /Documents/modem/web/rcmission/plongee/outils/ckeditor_RecevoirImage.php on line 39

Je tenterai donc de définir un répertoire temporaire.
Soyez artisans de paix

Mammouth du PHP | 810 Messages

28 janv. 2016, 17:14

Après vérification, mon répertoire /tmp existe
Il appartient à root
mais son accès est universel (chmod 777 )

Là, je ne sais plus.
Soyez artisans de paix

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7160 Messages

29 janv. 2016, 00:44

Regarde dans tes logs PHP pour voir si il n'y a pas une erreur qui traine.

Et sinon, je serai toi, je repartirai d'un script d'upload tout simple comme celui de la doc pour vérifier si au moins celui-ci fonctionne en standalone :
http://php.net/manual/fr/features.file- ... method.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 810 Messages

29 janv. 2016, 01:55

Merci encore @rthur, mais je ne trouve rien.
J'ai lu les logs suivants:
/var/log/apache2/error.log
/var/log/syslog

J'ai aussi défini la valeur upload_tmp_dir = "/var/www/tmp"
et la valeur error_log /var/log/php_errors.log
dans mon php.ini

Rien n'y fait. Je ne trouve aucune erreur.

J'ai téléchargé le sous-répertoire ckeditor de mon serveur en ligne (prod) en écrasant mon sous-répertoire ckeditor en local (dév.)
Rien n'y fait. Rappelons-nous que ça fonctionne en ligne, mais pas en local.
C'est fou!

J'espère qu'en installant php7 ça passera.
Merci pour ton aide.
Soyez artisans de paix

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7160 Messages

29 janv. 2016, 01:57

Et le script exemple de la doc ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 810 Messages

29 janv. 2016, 02:29

Merci @rthur, mais peu importe le script de réception ou de traitement lorsque je ne reçois rien.
C'est le script fourni par ckeditor qui gère le formulaire d'envoi.
J'ai testé l'exemple du manuel avec sys_get_temp_dir()
http://php.net/manual/fr/function.sys-get-temp-dir.php

Code : Tout sélectionner

$temp_file = tempnam(sys_get_temp_dir(), 'Tux'); echo $temp_file;
et le fichier s'enregistre dans mon répertoire /tmp, mais il a une taille de 0
C'est bien ce que me retourne ma variable $_FILES

Code : Tout sélectionner

$_FILES array(1) { ["upload"]=> array(5) { ["name"]=> string(22) "BassinLouise_1936.jpeg" ["type"]=> string(0) "" ["tmp_name"]=> string(0) "" ["error"]=> int(3) ["size"]=> int(0) } }
Au fond, ce qui compte, c'est que ça fonctionne en production.
Seuls les tests en local sont bousillés.

Je laisse le sujet ouvert. Si jamais quelqu'un trouvait une solution!
Soyez artisans de paix

Mammouth du PHP | 810 Messages

29 janv. 2016, 06:20

C'est en voie de se résoudre.
J'ai installé php7, mais l'installation était hybride avec 5.
J'eus alors de signes encourageant: une taille de document et autres informations cohérentes. Seul le répertoire temporaire était, disons, « spécial »
J'ai tout désinstallé php7 et php5 de mon ordinateur de développement.
Depuis, php7 et apache2 refusent de collaborer.
Lorsque j'aurai retrouvé mon serveur, je testerai de nouveau et pourrai confirmer le bon fonctionnement de mon ckeditor avec téléchargement d'images.
Soyez artisans de paix

Mammouth du PHP | 810 Messages

29 janv. 2016, 07:54

Voilà, mes serveurs apache2 et php7 se parlent de nouveau.
J'avais oublié d'installer le paquet libapach2-mod-php7

Dès le premier essai de ckeditor, le téléchargement d'une image a fonctionné.
Je passe en résolu.
Soyez artisans de paix