Mkdir ne fonctionne que sous IE ?!

Matt1983
Invité n'ayant pas de compte PHPfrance

07 oct. 2010, 21:31

Bonjour !

Je sais que mon titre peut paraitre absurde mais je suis compltement perdu. Il s agit de creer en local sous easyphp une page d upload de photo avec progress bar en flash qui place la photo dans un nouveau repertoire du nom de la session php active.

Sous IE tout va bien, un repertoire du nom de la session est cree et la photo transferee ! :P (exemple: imagenes/1232jkhais1234/photo.jpg)

Sous FF et Safari la photo est transferee a la racine imagenes et aucun repertoire n est cree ! (exemple: imagenes/photo.jpg)

je n y comprends rien et je ne vois pas en quoi le navigateur pourrait influencer sur une commande de creation de repertoire au niveau du serveur... j ai bien autorise l ecriture des repertoires sous windows et j ai meme essaye d inclure une commande chmod 777 dans mon script php mais rien n y fait, seul IE repond a ma demande. J ai vide le cache une centaine de fois et redemmare le pc au cas ou les fichiers pris en comptes soient les anterieurs de test ou la commande mkdir n etait pas encore presente mais rien...

MERCI d avance pour votre aide, c est probablement une betise de debutant mais j ai beau retourner ca dans tous les sens avec tous les tuto je ne vois pas le detail qui cloche.

please help !!!!! ci dessous le code des fichiers (il s agit d un test, c est simple et non securise!):

la page contenant le flash

Code : Tout sélectionner

<?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" > <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="Content-Language" content="es-co" /> <link rel="stylesheet" type="text/css" href="menu/menu_style.css" /> <title>test session</title> </head> <body> <?php $_SESSION['ref_session'] = session_id(); echo $_SESSION['ref_session']; ?> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="300" height="200"> <param name="movie" value="FileUpload.swf"> <param name="quality" value="high"> <embed src="FileUpload.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="300" height="200"></embed></object> </body> </html>
le flash

Code : Tout sélectionner

import flash.net.FileReference; var file_fr:FileReference = new FileReference(); var list_obj:Object = new Object(); file_fr.addListener(list_obj); var my_pb:mx.controls.ProgressBar; my_pb.mode = "manual"; my_pb.conversion = 1024; my_pb.labelPlacement = "top"; my_pb.label = "%3%% Uploadé (%1Ko/%2Ko)"; my_pb._visible = false; name_txt.text = "Sélectionnez un fichier"; browse_butn.clickHandler = function(){ file_fr.browse([{description: "tous", extension: "*.jpg"}]); } list_obj.onSelect = function(){ name_txt.text = file_fr.name; file_fr.upload("upload.php"); } list_obj.onProgress = function (bytesTotal, bytesLoaded){ my_pb._visible = true; my_pb.minimum = 0; my_pb.maximum = file_fr.size; my_pb.setProgress(bytesLoaded, my_pb.maximum); } list_obj.onComplete = function(){ name_txt.text = "Le colis est livré."; my_pb._visible = false; getURL("http://www.google.com", "_parent"); } list_obj.onCancel = function(){ name_txt.text = "Annulé"; } list_obj.onIOError = function(fileRef){ name_txt.text = "IO error with " + fileRef.name; } list_obj.onSecurityError = function(fileRef, error){ name_txt.text = "Security error with " + fileRef.name + ":" + error; } list_obj.onHTTPError = function(fileRef:FileReference, error:Number){ name_txt.text += "HTTP error: with " + fileRef.name + ":error #" + error;}
et enfin, la ou je pense ca cloche, le php d upload

Code : Tout sélectionner

<?php session_start(); if (isset($_FILES['Filedata']['name'])) { chmod ('/imagenes/', 0777); mkdir('imagenes/'.$_SESSION['ref_session'], 0777); $uploadDir = 'imagenes/'.$_SESSION['ref_session'].'/'; $uploadFile = $uploadDir . basename($_FILES['Filedata']['name']); move_uploaded_file($_FILES['Filedata']['tmp_name'], $uploadFile); } ?>

Eléphanteau du PHP | 18 Messages

08 oct. 2010, 01:35

Pourrais tu mettre les balises code ?

aurais tu une page test en ligne (envoie le lien en PV si tu veux) pour voir à quoi ressemble le "bug" ?

ViPHP
xTG
ViPHP | 7331 Messages

08 oct. 2010, 07:34

Est-ce que Safari et Firefox acceptent les cookies ?
Car sans cookies pas de session et pas de goûter !

Matt1983
Invité n'ayant pas de compte PHPfrance

09 oct. 2010, 02:01

Est-ce que Safari et Firefox acceptent les cookies ?
Car sans cookies pas de session et pas de goûter !
Bonsoir et merci pour les reponses...

je vasi mettre en ligne une page de test pour montrer le prob... mais comme le dit probleme se passe au niveau du serveur ca ne va pas trop aider je pense.

pour les cookies j ai verifie ils sont actives et la page de test arrive a recuperer un id de session sous les 3 navigateurs, le probleme est que sous 2 d entres eux, l image est bien uploadee mais directement a la racine comme si la commande mkdir n etait pas prise en compte alors que sous IE l image est bien uploadee dans un nouveau repertoire du nom de la session !

sur un autre forum ils persistent a me dire que le probleme viendrait du flash, ce dont je doute car si vous regardez l AS je ne vois aucune reference au repertoire de destination ! tout est dans le fichier php... en plus si cela venait du flash pourquoi tout fonctionne avec IE ?!

bref je suis loin d etre un expert mais je suis perplexe quant a ces reponses et surtout..... bloque !

ViPHP
xTG
ViPHP | 7331 Messages

09 oct. 2010, 07:03

Je n'ai pas d'autres idées lumières pour le moment désolé. :/
Il n'y a aucune raison que le soucis vienne de la fonction mkdir, c'est exécuté côté serveur et on se fiche du navigateur.
Donc cela ne peut venir que d'un problème d'argument passé à cette fonction, d'où mon interrogation sur les sessions.

Si tu fais un var_dump($_SESSION); dans ton code PHP, y-a-t-il des différences suivants les navigateurs ?

Matt1983
Invité n'ayant pas de compte PHPfrance

09 oct. 2010, 16:44

merci poru ton aide...

non pas de difference :(

un var_dump($_SESSION) a la fin de ma page principale (ou s initialise la session) me renvoie la meme chose sur les 3 navigateurs, par exemple :

array(1) { ["ref_session"]=> string(26) "ihfvlk7g2abblrlsde43ob7k52" }

je sais que le mkdir se fait cote serveur d ou mon incomprehention totale de cette difference entre FF et IE... Je n ai vraiment aucune idee de ce qui se passe.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 oct. 2010, 20:11

Que retourne ta fonction mkdir quand tu utilises FF ?

Petite remarque : tu fais un chmod sur le dossier "/imagenes/", c'est à dire que tu changes les droits du répertoire "imagenes" qui se trouve à la racine du disque. Puis tu fais un mkdir dans le dossier "imagenes/" (sans le "/" initial), c'est à dire que tu fais référence à un répertoire "imagenes" qui se trouve dans le même répertoire que ton script.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

matt1983
Invité n'ayant pas de compte PHPfrance

10 oct. 2010, 03:08

bon........... il semblerait que le probleme vienne de l identifiant de session. En remplacant ma variable de session qui contenait l id par la commande session_id(), j arrive maintenant a creer un repertoire avec cette identifiant.

ce qui cloche c est que sous IE ma page index.php renvoie un id de session identique au repertoire cree par upload.php, par contre sous FF et Safari, il semblerait qu en passant d une page a l autre l id de session change !! une session php n est elle pas censee etre conservee entre les pages jusqu a realisation d un session_destroy ou un timeout ?

je remets le code:

index.php

Code : Tout sélectionner

<body> <?php $identifiant = session_id(); echo "hola !<br />"; echo $identifiant; echo '<br /><br />'; ?> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="300" height="200"> <param name="movie" value="FileUpload.swf"> <param name="quality" value="high"> <embed src="FileUpload.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="300" height="200"></embed></object> </body>
upload.php

Code : Tout sélectionner

<body> <?php $chemin = session_id(); if (isset($_FILES['Filedata']['name'])) { chmod ("imagenes/", 0777); @mkdir($chemin, 0777); chmod($chemin, 0777); $uploadDir = $chemin.'/'; $uploadFile = $uploadDir . basename($_FILES['Filedata']['name']); move_uploaded_file($_FILES['Filedata']['tmp_name'], $uploadFile); } ?> </body>
le flash n a pas change et j ai bien un session_start() au tout debut des deux pages !

ViPHP
xTG
ViPHP | 7331 Messages

10 oct. 2010, 08:20

Si l'id de session change c'est que la session a été perdue, soit écrasée par le script soit que les cookies ne sont pas enregistrés.

matt1983
Invité n'ayant pas de compte PHPfrance

10 oct. 2010, 16:42

bon je crois que j ai trouvé... pour info je le partage ici....

Il semblerait que le probleme vienne de Flash et que l utilisation de FileReference.upload ne permette pas de récupérer et d’utiliser les sessions PHP sous un autre navigateur que IE. (voir article ci dessous)
http://blog.ludikreation.com/2010/06/11 ... e-session/

Contrairement a l article je n utilise pas flex et AMFPHP donc je ne vois que deux solutions:
1. ne debuter la session qu une fois le fichier flash realisé.
2. recuperer l id de session dans BDD avant execution du flash et demarrer une nouvelle session en forcant ce meme id apres execution du flash.

je pense que la deuxieme solution est lourde mais je ne vois pas d autres manieres de faire pour le moment avec mon niveau !

merci en tout cas pour votre aide :D

ViPHP
xTG
ViPHP | 7331 Messages

10 oct. 2010, 18:50

3) Tu peux aussi forcer l'ID de session via l'url. ^_-
Ainsi elle ne devrait pas être perdue.