Message d'avertissement

The subscription service is currently unavailable. Please try again later.

Fichiers attachés

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour / bonsoir à tous,
Mon site commence à prendre tournure, donc il se remplit. Bien.
Cela dit tous les fichiers attachés tombent dans le dossier drupal/files, ça m'ennuie j'aurais préféré que chaque livre range les fichiers attachés des diverses pages dans des dossiers différents (plus simple pour les téléchargements). Je crains un peu d'avoir + de 200 fichiers dans le dossier files ...
Quel module sait faire ça ?

Version de Drupal : 

Salut,

J'ai réglé ce problème en créant une page avec un code php qui gère lui même l'upload de fichier :
le formulaire et le code de l'upload se trouvant dans la même page, sinon la page n'est plus reconnu comme un contenu de Drupal.
Voici un exemple simple d'upload. Vous pouvez (et devez) ajouter des controle sur la taille (et les extensions sur le fichier) afin de sécuriser les uploads :

<?php

/* Si le formulaire a été validé <em>/
if( isset($_POST['sub']) )
{
    /</em> On récupère le nom du fichier <em>/
    $fichier = basename($_FILES['depot']['name']);
 /</em> On récupère l'extension du fichier, ex : ".txt" <em>/
   $extension = strrchr($fichier, '.');
 /</em> On enlève l'extension au nom du fichier <em>/
 $fichier = preg_replace('#([a-z0-9_-]+).[a-z0-9]{2,4}#','$1', $fichier);
  /</em> On insère le timestamp au nom du fichier (juste avant l'extension)<em>/
   $time = time();
    $nom_fichier = $fichier.$time.$extension;

 /</em> On récupère la source à télécharger <em>/
  $source = $_FILES['depot']['tmp_name'];

   /</em> On définie dans quel répertoire sera stocker le fichier <em>/
  $dossier = "files/mon_repertoire/".$nom_fichier;  // Attention, les répertoires doivent exister et être en droit 755(minimum)

   if ( move_uploaded_file($source,$dossier) ) //Si la fonction renvoie TRUE, l'upload à fonctionné
  {
      chmod  ( $dossier  ,  0755  ); // Droit du fichier uploadé
     echo $nom_fichier.' a été uploadé.';

    }
  else //Sinon (la fonction renvoie FALSE).
  {
      echo $nom_fichier."n'a pas été uploadé !";
  }
}
else /</em> Si le formulaire n'a pas été validé, on l'affiche */
{
?>

<form method="POST" action="" enctype="multipart/form-data">
   <table>
      <tr>
         <td colspan=2><input type="file" name="depot" size="40"></td>
          <input type="hidden" name="sub" value="OK">
        </tr>
        <tr> 
           <td colspan=2>
               <input type="submit" name="envoyer" value="uploader">
          </td>
        </tr>
    </table>
</form>
<?php
}
?>

En faite, je place ce code dans un fichier ("upload.php") que je place ensuite dans le dossier de Drupal.
Ensuite, je crée une Page (mais tu peux le mettre dans un autre type de contenu) et je met dans le body :

<?php include('upload.php'); ?>

avec le Format d'entrée : PHP code (il faut l'interpréteur PHP).

Ce qui fait que j'ai un formulaire unique pour tous les uploads.
Remarque : si tu as plusieurs type d'upload à faire, tu peux faire plusieurs Page de ce genre.

Maintenant, si tu veux attacher ces fichiers à un contenu en particulier, il faut que tu modifies la base de donnée de Drupal afin d'enregistrer ton fichier et l'attacher dans la bd. En gros, si tu as créé un contenue ayant la node $nid, le code ressemble à peut près à ceci :

Le module upload doit être installé pour avoir la table file de crée.
Ensuite, insert, après la ligne

<?php
 
echo $nom_fichier.' a été uploadé.';
?>

, le code :

<?php
$nid
= 12; // Ici je prend comme exemple un contenu ayant pour node 12.

/* Connexion à la base <em>/
global $db_url;
db_connect($db_url);

/</em> On détermine le prochain fid de disponible <em>/
$data=db_fetch_array(db_query("SELECT fid FROM <code>files</code> ORDER BY fid DESC ;"));
$fid = $data['fid']+1;
    
  
/</em> On enregistre le fichier dans la table file : il est alors attaché au contenue de node $nid */
db_query("INSERT INTO <code>intellicast_groupware</code>.<code>files</code> (<code>fid</code> ,<code>nid</code> ,<code>filename</code> ,<code>filepath</code> ,<code>filemime</code> ,<code>filesize</code>) VALUES ('".$fid."', '".$nid."', '".$nom_fichier."', '".$dossier."', 'file/video', '".filesize($dossier)."');");
?>

Attention, j'ai réutilisé les variables du code que j'ai mis.

Voilà, j'espère que ça t'aideras.

Bonjour,

J'aimerais ajouter un champ qui permet de joindre un fichier, lorsqu'un utilisateur veut créer un nouveau compte.

J'ai activé le module profil pour les informations des utilisateurs, j'ai ajouté les champs Nom, Prénom, Adresse, etc... mais j'aimerais maintenant qu'ils puissent joindre un fichier (CV) avec leur inscription. J'ai le module upload qui est installé.

Comment est-ce que je peux faire ça ?

D'avance merci beaucoup si vous avez une solution.

Bonne après-midi

Xavier