8792 sujets

Développement web côté serveur, CMS

Bonjour,

je travaille sur un petit projet qui consiste à déplacer un fichier et renommer un fichier et ceci quelque soit l'endroit d'où on l'upload.

J'ai donc un soucis avec la destination du fichier que l'on upload. En effet, il faut uploader le fichier à la racine d'un serveur. J'ai donc pensé naturellement dans ma variable de destination à me servir des "../" mais comme le fichier ne vient pas toujours du même dossier il faudrait autre chose Smiley smile

Si vous pouviez me renseigner quant à ce petit soucis que je n'arrive pas à résoudre. J'ai regarder un peu sur Internet et mes essai n'ont pas été concluant, notamment avec ~/

Je vous met le code en lien au cas où.


<script language="javascript">
function test_champ(f){
	var nomfic=f.fichier.value;
	if (nomfic==""){
		alert("Vous n'avez pas indiqué de nom de fichier");
		return false;
	}else{
		f.action="index.php?page=saisie2c&lien=envoie";
		f.submit();
	}
}
</script>

<form action="" enctype="multipart/form-data" method="post" name="formu">
		<input type="file" name="fichier" class="input"><br /><br />
		<input type="button" name="soumettre" value="Modifier le fichier" class="input" onclick="test_champ(formu);"/>
</form>
<?php
if (isset($_GET['lien']) && $_GET['lien']=="envoie"){
		
	[#red][b]$destination="./file:///C:/Program%20Files/fichiers/mouvements/";//Répertoire de destination des fichiers uploadés[/b][/#]
	$nomfichier = $_FILES["fichier"]["name"] ;//Nom du fichier uploadé
	$poidsFichier = $_FILES["fichier"]["size"] ;//Poids du fichier (en octets) uploadé
	$tab=explode(".",$nomfichier);//On veut récupérer le nom du fichier et changer l'extension, on met casse donc la chaine grace 				aux séparateurs "." (sachant qu'un fichier peut très bien contenir un "." dans son nom. Cet exemple ne fonctionne seulement si le fichier ne contient pas plus de deux points dans son nom.

	//nvo_nomfichier contient le fichier renommmé en ".dat"
	if (count($tab)>2){
		$nvo_nomfichier=$tab[0].".".$tab[1].".dat";
	}else{
		$nvo_nomfichier=$tab[0].".dat";
	}
	
	if($poidsFichier <> 0){//Test si le poid du fichier est supérieur à zéro
		if(@copy($nomfichier, $destination.$nvo_nomfichier)){//On copie le fichier uploadé dans l'emplacement répertoire en changeant son extension		
			echo "<font color='#FF000'>Le fichier ".$nomfichier." a bien été déplacé et renommé : ".$nvo_nomfichier."</font>";
		}else{
			echo "<font color='#FF000'>Impossible de renommer et déplacer le fichier.</font>";
		}
	}else{
		echo("<font color='#FF000'>Le fichier choisi a une taille de zéro octet</font><br>");
	}
}
Salut

perso j'utilise pas le get mais le POST et donc du coup

va voir par ici

http://fr3.php.net/manual/fr/function.is-uploaded-file.php

c'est une fonction spécialement prévue pour vérifier si tu as bien reçu le fichier uploader

dans ton cas

if (is_uploaded_file($_FILES['fichier']..........){}


en clair le fichier est en mémoire tu en fait ce que tu veux et où tu veux sur ton site
Modifié par alexiase (26 Apr 2007 - 07:15)
:)

En réalité, je me sers du $_FILES['fichier'] mais sous une forme différente, ce dernier est enregistré en mémoire, pas de problème pour ça, mon soucis viens juste d'un problème de lien.

si l'utilisateur se trouve à un point A de l'arboresence et reçoit un fichier. Il faut que le fichier s'enregistre via le formulaire d'upload automatiquement dans un dossier a la racine du serveur.
Si lutilisateur se trouve à un point B de l'arborescence plus haut ou plus bas, le fichier qu'il upload doit aussi s'enregistrer au même endroit.

Le problème se situe dans le fait que le chemin de l'arborecence pour atteindre la racine du serveur n'est pas le même selon l'endroit où l'on a enregistré le fichier uploadé.

Un exemple vaut mieux qu'un grand discours Smiley cligne :

j'ai deux fichiers :
fic1.txt situé : c:\doc\essai\fic1.txt
fic2.txt situé : d:\essai\test\fichiers\fic2.txt

Les chemins ne sont donc pas les mêmes.
Il faut maintenant que lorsque j'upload l'un ou l'autre des fichiers ils se retrouvent là :
\\srvsrv\e:\fichiers\upload.


Voilà mon problème... J'espère avoir été clair, je suis vraiment desespéré car je ne trouve pas de solution... (soit ça marche pour un fichier et plus l'autre ou l'inverse Smiley bawling )

Je vous remet le code un peut simplifier :

</script>
<form action="" enctype="multipart/form-data" method="post" name="formu">
		<input type="file" name="fichier" class="input"><br /><br />
		<input type="button" name="soumettre" value="Modifier le fichier" class="input" onclick="test_champ(formu);"/>
</form>

  <?php
if (isset($_GET['lien']) && $_GET['lien']=="envoie"){
		
	$destination='e:\Traitement\SAISIE2C\\';//Répertoire de destination des fichiers uploadés
	$nomfichier = $_FILES["fichier"]["name"] ;//Nom du fichier uploadé
	$poidsFichier = $_FILES["fichier"]["size"] ;//Poids du fichier (en octets) uploadé
	
	if($poidsFichier <> 0){//Test si le poid du fichier est supérieur à zéro
		if(@copy($nomfichier, $destination."SAISIE2C.DAT")){//On copie le fichier uploadé dans l'emplacement répertoire en changeant son extension		
			echo "<font color='#FF0000'>Le fichier ".$nomfichier." a bien été déplacé et renommé en SAISIE2C.DAT</font>";
		}else{
			echo "<font color='#FF0000'>Impossible de renommer et déplacer le fichier.</font>";
		}
	}else{
		echo("<font color='#FF0000'>Le fichier choisi a une taille de zéro octet</font><br>");
	}
}

?> 


Je compte sur vous... siouplait Smiley smile
ok plus clair
jete un oeil à çà:


$_SERVER['DOCUMENT_ROOT'] ==> adresse du serveur
$_SERVER['REQUEST_URI'] ==> adresse complète du fichier apelé à partir de la racine

soit :



echo $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];

// affiche l'adresse complète du fichier PHP



si tu veux isoler le chemin manipule $_SERVER['REQUEST_URI']
Modifié par alexiase (26 Apr 2007 - 09:31)
Merci merci alexiase Smiley smile on avance, on avance, mais ce n'est toujours pas ça Smiley cligne

Voilà le contenu des deux variables, pour info :
$_SERVER['DOCUMENT_ROOT'] =>
e:/intranets/www
$_SERVER['REQUEST_URI'] =>
/Statportuaires/index.php?page=saisie2c&lien=envoie

Dans la page saisie2c.php (appelée via l'index) j'ai mon formulaire d'upload. Ce que je voudrai récupérer c'est le chemin du fichier que j'upload, afin de remonter dans l'arborescence et l'enregistrer automatiquement à la racine du serveur (comment on fait pour enregistrer à la racine du serveur???)

REQUEST_URI me retourne le chemin de ma page php donc c'est pas vraiment ça Smiley decu

S'il te plait, s'il vous plait ne m'abandonnez pas Smiley smile j'ai beau chercher sur Internet je trouve pas et les autres forum que j'ai fait, pas de réponse y'a qu'ici où il y a des réactions


Je vous en supplie Smiley sweatdrop Smiley cligne

merci d'avance
Bon j ai lu en travers....que de code pour un feignant comme moi Smiley langue ....

mais le fichier uploadé passe par un fichier temporaire avant que tu le deplace non? on a son nom par la : $_FILES["userfile"]["tmp_name"];

et le chemin du cache doit être dans une valeur de php.ini j'imagine.

edit: bouh j'ai rien dis tous ça est dans le lien de alexiase...donc j'ai rien dit
Modifié par CPascal (26 Apr 2007 - 13:32)
es functonniert nicht!!!!

je comprend pas et je vais pas tarder a abandonner Smiley decu à mmon grand regret Smiley decu

siouplait
et quand meme il y a quelquechose que je ne comprend pas.

pk tiens tu forcément a passer par des chemin en ../ c'est a dire relatif?

la fonction move_uploaded_file peut trés bien prendre une valeur absolu de la position de ta racine.

Tu m'avais mis le doute mais la derniere fois que j'ai eu un travail j'ai bien utilisé un chemin absolu en me servant d'une variable qui contenait l'adresse de la racine ds le disque dur.

et pour faire un move_uploaded_file il ne faut que deux info la source ca c'est fourni par les variables $_FILES (et c'est le fichier temporaire qui nous importe ) et la destination que tu n'as qu'a mettre en dur sinon a determiner dynamiquement a partir de la variable __FILE__ sur laquelle tu appliques quelques traitements.

Pascal
Modifié par CPascal (26 Apr 2007 - 16:45)
Mon cher Pascal je te remercie de tes conseils avisés Smiley smile apparement tout est clair sauf un petit point Smiley smile

a écrit :
a determiner dynamiquement a partir de la variable __FILE__ sur laquelle tu appliques quelques traitements


la variable __FILE__?!:;"e? Smiley smile

et oui je débute, je cono pas tout.

Merci de ta patience, je sens que l'on approche de la solution finale Smiley smile
Malheureusement je ne pourrai tester que demain matin.

Je vous tiens au courant
bon ce que je comprend pas c'est pk tu veux absolument connaitre ton chemin
le fichier en upload est gardé en mémoire voire dans le temp de php

alors bon tu récupère ta valeur dans la variable au même titre que la valeur d'un formulaire (c'est d'ailleurs u nformulaire qui permet l'upload)

la taille du fichier est déterminé par la valeur du buffer qui est par défaut 2048Ko sauf erreur de ma part

pour info passe plutot les paramètre de ton url par la method post et les valeur passés les en
<input type='hidden' value='' />

plutot que ....php?val=ddd&bidule=eee






perso après upload je fais la chose suivante:





<script language="javascript">
function testPixName(name){

// ici tes tests........
// si ok
	document.up.boolform.value=1;
	document.up.submit();

}
</script>



<form name='up'  method='post' ENCTYPE='multipart/form-data' >

<input name='upfile' type='file' size='50' />

<input type='hidden' name='boolform' value='0' />
<input type='button' value='T&eacute;l&eacute;charger' onclick='testFileName(document.up.upfile.value);' />

<input type="hidden" name="photoSubmit" value="1" />
<input type="hidden" name="item" value=" " />
<input type="hidden" name="page" value="edit" />		

</form>





ensuite à la reception:



if ($_POST['boolform']==1){

// ici c'est 'upfile' parce que dans mon formulaire c'est <input name='upfile' type='file' size='50' />


/* le fichier reçu est sous form de tableau:
$_FILE['upfile']['tmp_name'] : contient le nom temporaire du fichier reçu sur le serveur ***** ce que tu cherches depuis longtemps *****

$_FILES['upfile']['size'] : contient la taille du fichier

$_FILES['upfile']['name'] : contient le nom (celui de la machine qui l'a envoyé)

$_FILES['upfile']['type'] : le type mime du fichier ... jpg, gif zip txt ....

	if (is_uploaded_file($_FILES['upfile']['tmp_name'])){

move_uploaded_file($_FILES['upfile']['tmp_name'],$cheminComplet);

// exemple $cheminComplet  : ../../fichiersRecus/monFichier.zip
 }  






http://fr2.php.net/manual/fr/features.file-upload.php


voilà problème résolu en allant surle lien même un newby comprend

au fait le code ci-dessus est opérationnel
Modifié par alexiase (26 Apr 2007 - 19:56)
Je te remercie de ton abnégation alex Smiley smile

les post par rapport aux get, c'est vrai que c'est pas mal Smiley smile j'utilisais les Get par habitude mais ça m'a l'air plus sécurisé tout ça.

J'ai bien sur essayé d'adapter mon code à tes conseils, je n'ai plus qu'à tester mais selon moi le problème restera le même Smiley cligne

je vais vraiment essayé d'être super clair comme de l'eau de roche transparente Smiley langue

Le problème avec mon chemin (variable que toi tu as appelé "$chemincomplet") c'est que les fichiers qui sont uploadé sont situé sur un serveur et le traitement lui, se déroule sur un autre serveur.
Je dois donc transferré via la fonction move_upload_file() le fichier uploadé sur un autre serveur.

exemple : j'ai un fichier sur mon bureau :
c:\lala\lala\fic.txt
que je veux transferré et renommer via mon site sur un autre serveur
\\srvsrvve\docatraiter\

ce qu'il me faut donc c la valeur de $chemincomplet. Comment faire le lien entre les deux endroits. J'ai essayé avec ~, avec.\ avec les chemin unc Smiley smile

Voili voilou j'espere que l'histoire de mon chemin est plus claire pour toi.

Je te remercie encore (pour ta patience surtout Smiley cligne )
Ok donc tu pilotes A qui envoi le fichier sur B et B l'envoi en automatique sur C?

Ou C vient le chercher sur B ??


As tu la maitrise de C?
Modifié par alexiase (27 Apr 2007 - 10:16)
pour repondre a la question pour mon post

et bien __FILE__ c'est une variable magique qui te donne le chemin/lenom_du script où tu la lance.

Lancer depuis un fichier dans la racine on peut ainsi determiner le chemin en éliminant la partie nom de fichier.et donc avoir le chemin dans une variable ou constante meme si on est passer d'une installation local a free et puis a bidulechose.

bon ca c'est le cas un serveur. apres avec plusieurs mystere et boules de gomme pour moi.

pascal
Modifié par CPascal (27 Apr 2007 - 10:08)
Et voilà le sujet est clos Smiley smile

j'ai réussi après des petites galères Smiley smile

Il s'agissait d'un problème de droits sur notre serveur et également un problème d'interprétation de la fonction move_upload_file de ma part (surtout ça a vrai dire Smiley cligne )

Donc le tout fonctionne correctement desormais

Merci pascal, merci alex (même si apparement tu commencais a perdre patience et raconter des choses bizarre sur la maitrise de C Smiley cligne Smiley langue )

Dans move_upload_file il fallait mettre le nouveau nom de fichier et sur ce coup j'ai fait le boulet Smiley smile

bon, je suis bien soulagé et je vais pouvoir passé un week end sans y penser Smiley smile

Merci encore a vous et a ce forum et site qui m'aide beaucoup dans mes galère Smiley biggrin