Page 1 sur 2

Upload fichier

Posté : 16 nov. 2005, 16:30
par betman
Encore moi, oui je sais j'ai plein de problème aujourd'hui...

J'ai une page qui contient un formulaire et un upload de fichier.

Séparément le formulaire fonctionne très bien, et l'upload également (j'ai suivi le tutorial de votre site)

Mais voilà une fois réuni sur la même page, l'upload ne fonctionne plus, mais en revanche les données du formulaire s'enregistre parfaitement.

Comme j'ai 2 balise form et deux fichier en ACTION, je pense que le bug vient de là.

PS : Dans votre tutorial, il est prévu uniquement prévu d'uploader le fichier dans un répertoire définit, ou dans l'enregistrer dans une bdd également?

Si oui, c'est un bien un champ de type BLOB qu'il faut créer nan?


Code : Tout sélectionner

<form name="frm" method="post" action="ajout_anomalies.php" enctype="multipart/form-data">
etc etc (champ de mon formulaire, tout fonctionne)

on arrive à l'upload
<?php

if(isset($_FILES['photo']))
{
// params
unset($erreur);
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'txt');
$taille_max = 500000;
$dest_dossier = 'img/';
// vérifications
if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
{
$erreur = 'Veuillez sélectionner un fichier de type png, gif ou jpg !';  
}
elseif( file_exists($_FILES['photo']['tmp_name']) 
and filesize($_FILES['photo']['tmp_name']) > $taille_max)
{
$erreur = 'Votre fichier doit faire moins de 500Ko !';
}
// copie du fichier
if(!isset($erreur))
{
$dest_fichier = basename($_FILES['photo']['name']);
// formatage nom fichier
// enlever les accents
$dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
// remplacer les caracteres autres que lettres, chiffres et point par _
$dest_fichier = preg_replace('/([^.a-z0-1]+)/i', '_', $dest_fichier);
// copie du fichier
move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
}
}

?>
<?php 
if(isset($erreur)){
echo '<p>', $erreur ,'</p>';
}
?> /php*/
<!-- Formulaire -->
<!-- Attention, ne de ne pas oublier le  enctype="multipart/form-data" -->
<form method="POST" action="upload_file.php" enctype="multipart/form-data">
<!-- Limiter la taille des fichiers à 500Ko -->
<input type="hidden" name="MAX_FILE_SIZE" value="500000" />
<fieldset>
<legend>Envoi de fichiers</legend>
<!-- champs d'envoi de fichier, de type file -->
<p>
<label for="photo">Photo :</label>
<input type="file" name="photo" />
</p>
<!-- bouton d'envoi -->
<p>
<input type="submit" name="envoi" value="Envoyer les fichiers" />
</p>
</legend>
</fieldset>
</form>
et un peu plus bas, le premier formulaire se ferme en globant le formulaire d'upload :/
<input type="submit"  value="Envoyer" name="submit">
</form>

Posté : 16 nov. 2005, 16:33
par jeff
PS : Dans votre tutorial, il est prévu uniquement prévu d'uploader le fichier dans un répertoire définit, ou dans l'enregistrer dans une bdd également?

Si oui, c'est un bien un champ de type BLOB qu'il faut créer nan?
oui pour une image on utilise un blob mais tu peut aussi choisir d'enregistrer seulement un chemin (tout depend de ta base)

sinon ton code je l'ai pas regarder, ca me rebute

Posté : 16 nov. 2005, 16:36
par betman
jeff, pour le code je te comprends...

Dans ma base j'ai prévu un BLOB pour le fichier.

Sachant que séparemment, mon formulaire fonctionne ainsi que l'upload. Comment dois-je réunir les 2 formulaires pour n'obtenir qu'un seul bouton envoyer ?

Et dans le code de votre tuto upload, le fichier n'est que copier ou bien on peux préciser de l'enregistrer dans une BDD ?

Posté : 16 nov. 2005, 16:37
par rami
Mets ton code entre balise PHP et non pas Code. Ca facilitera la lecture ;)

Posté : 16 nov. 2005, 17:11
par betman
j'ai remanier mon code pour que ca soit plus simple pour vous ^:)

Posté : 16 nov. 2005, 17:15
par jeff
un peu plus bas, le premier formulaire se ferme en globant le formulaire d'upload :/
tu ne peut pas avoir 2 formulaires imbriqués
fais en un seul

Posté : 16 nov. 2005, 17:18
par betman
je m'en doutais mais je ne comprends pas comment enregistrer tout d'un seul coup.

L'image je pense se copiera tout de même, mais à quel niveau dois-je l'enregistrer dans la BDD?

Posté : 16 nov. 2005, 17:23
par jeff
tu peut faire un truc du genre
<form name="frm" method="post" action="traitement.php" enctype="multipart/form-data">
fichier traitement.php
if(isset($_FILES['photo'])) 
include 'upload.php';//traitement de la photo

//traitement des autre donné du formulaire


Posté : 16 nov. 2005, 17:30
par betman
je suis arrivé à ne faire qu'un suel formulaire.

Mes données s'enregistre bien et mon image se copie dans le répertoire défini.

Mais je ne vois pas où enregistrer l'image dans la bdd

j'ai crée un champ photo de type BLOB

mais il reste vide,

pour info mon fichier qui enregistre dans la bdd est le suivant :
<?

include('connection.inc.php');

if(isset($_FILES['photo']))
{
  // params
  unset($erreur);
  $extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'txt');
  $taille_max = 500000;
  $dest_dossier = 'img/';
  // vérifications
  if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) )
  {
    $erreur = 'Veuillez sélectionner un fichier de type png, gif, jpg ou txt !';  
  }
  elseif( file_exists($_FILES['photo']['tmp_name']) 
          and filesize($_FILES['photo']['tmp_name']) > $taille_max)
  {
    $erreur = 'Votre fichier doit faire moins de 500Ko !';
  }
  // copie du fichier
  if(!isset($erreur))
  {
    $dest_fichier = basename($_FILES['photo']['name']);
    // formatage nom fichier
    // enlever les accents
    $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    // remplacer les caracteres autres que lettres, chiffres et point par _
    $dest_fichier = preg_replace('/([^.a-z0-1]+)/i', '_', $dest_fichier);
    // copie du fichier
    move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier);
  }
}

$query = "INSERT INTO anomalies(id_anom,nom,date,anomalies,desc_anom,photo) VALUES ('','".$_POST['nom']."','".$_POST['date']."','".$_POST['anomalies']."','".$_POST['desc_anom']."','".$_POST['photo']."')"; 
$result = mysql_query($query) or die ('Erreur SQL !<br>'.mysql_error());


header('location: anomalies2.php');
?>

Posté : 16 nov. 2005, 17:37
par jeff
et si tu remplace par
$dest_dossier . $dest_fichier
$_POST['photo']

Posté : 16 nov. 2005, 17:43
par betman
et si tu remplace par
$dest_dossier . $dest_fichier
$_POST['photo']
tu me disais bien de remplacer ta première ligne par la seconde ?

si c'est le cas l'image ne se copie plus...

Posté : 16 nov. 2005, 17:49
par jeff
non
:oops:
$query = "INSERT INTO anomalies(id_anom,nom,date,anomalies,desc_anom,photo) VALUES ('','".$_POST['nom']."','".$_POST['date']."','".$_POST['anomalies']."','".$_POST['desc_anom']."','".$dest_dossier . $dest_fichier."')";

Posté : 16 nov. 2005, 18:06
par betman
Génial ca fonctionne !! thx à tous

Heu dernière question après je vous laisse tranquille

Lorsque je fais appel aux données de ma bdd, cela me retourne le chemin et le nom de l'image.

Moi je préfererai l'image elle meme !!

Il faut effectuer un appel particulier ?
<?
include('connection.inc.php');
$query = "SELECT * FROM anomalies ORDER BY id_anom DESC";
$result = mysql_query($query);
$nb = mysql_numrows($result);
while ($val = mysql_fetch_array($result))

{ /* On parcoure les résultats de la requête */
	$id_anom = $val["id_anom"];
	$nom = $val["nom"];
  	$date = $val["date"];
  	$anomalies = $val["anomalies"];
	$desc_anom = $val["desc_anom"];
	$photo = $val["photo"];
  	$bool = $val["bool"];
	
  echo "
    <table width='750' border='0' align='center' cellpadding='5' cellspacing='0'>
      <tr>
	    <td width='15%' class='texte_gras'>$date</td>
        <td width='28%' class='texte_gras'><a href='repondreanom.php?id_anom=$id_anom' class='texte_lien'>$anomalies</a></td>
        <td width='28%' class='texte_gras'><a href='repondreanom.php?id_anom=$id_anom' class='texte_lien'>$nom</a></td>
        <td width='28%' class='texte_gras'><a href='repondreanom.php?id_anom=$id_anom' class='texte_lien'>$photo</a></td>

		<td width='30%' class='status'> "; if ($val["bool"]==1) echo "[Corrigée]"; echo"</td>
	  </tr>
      <tr>
        <td colspan='5' height='1' bgcolor='#f9c9c6'></td>
      </tr>
    </table>
	";
}
?>

Posté : 16 nov. 2005, 21:36
par Cyrano
Si ton image est enregistrée dans un répertoire à part, ce n'est pas envisageable. Il faudrait pour ce que tu veux faire enregistrer l'image en format binaire directement dans la base : bonjour la galère. Je déconseille.

Par contre, je conseille vivement une séparation nette entre PHP et HTML :
<?php
include("connection.inc.php");
$query  = "SELECT * FROM anomalies ORDER BY id_anom DESC";
$result = mysql_query($query);
$nb     = mysql_numrows($result);
while ($val = mysql_fetch_array($result))
{
    /* On parcoure les résultats de la requête */
    $id_anom   = $val["id_anom"];
    $nom       = $val["nom"];
    $date      = $val["date"];
    $anomalies = $val["anomalies"];
    $desc_anom = $val["desc_anom"];
    $photo     = $val["photo"];
    $bool      = $val["bool"];

    $status = ($val["bool"]==1) ? "[Corrigée]" : null;
?>
    <table width="750" border="0" align="center" cellpadding="5" cellspacing="0">
      <tr>
        <td width="15%" class="texte_gras"><?php echo($date); ?></td>
        <td width="28%" class="texte_gras"><a href="repondreanom.php?id_anom=<?php echo($id_anom); ?>" class="texte_lien"><?php echo($anomalies); ?></a></td>
        <td width="28%" class="texte_gras"><a href="repondreanom.php?id_anom=<?php echo($id_anom); ?>" class="texte_lien"><?php echo($nom); ?></a></td>
        <td width="28%" class="texte_gras"><a href="repondreanom.php?id_anom=<?php echo($id_anom); ?>" class="texte_lien"><?php echo($photo); ?></a></td>
        <td width="30%" class="status"><?php echo($status); ?></td>
      </tr>
      <tr>
        <td colspan="5" height="1" bgcolor="#f9c9c6"></td>
      </tr>
    </table>
<?php
}
?>
Ne trouves-tu pas ça plus clair comme ça ? Ça coute à peine quelques millisecondes de plus pour rédiger un code proprement et c'est infiniment plus facile à suivre et à débugguer au besoin.

Posté : 17 nov. 2005, 11:15
par Invité
cyrano,

J'avoue c'est beaucoup plus lisible ^^. Je suis en train de reformater mes pages de cette manière.

Pour l'histoire de l'image, je n'ai pas bien saisie...

Mon image est copié dans un répertoire, il n'y a aucune de façon de la rappeller pour un affichage de l'image elle même ? ( du moins avec le code utilisé)