[Résolu] Import fichier .csv pouvant remplir champ d'une table sql

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,

Je suis actuellement sur la création d'un module permettant de télécharger un fichier .csv par un formulaire de type => file dans l'interface configuration de mon module. le soucis qui se pose : je ne parvient pas à enregistré le fichier mis dans le input de type file.

<?php
$form
['csv']['csv_file'] = array(
   
'#type' => 'file',
   
'#title' => t("charger un fichier csv 'fichier.csv' "),
   
'#description' => t("IMPORTANT : Les entrées du fichier .csv doivent étre séparées par des ' ; ' ."),
   
'#default_value' => ''    
 
);

$form['submit'] = array(
      
'#type' => 'submit',
      
'#value' => t('Envoyer'
       
));

if(isset(
$_FILES['[csv_file]'])){
   
$files = $_FILES['[csv_file]']['name']['tmp_name'];
   
$fichier = fopen($_FILES['csv_file']['tmp_name'], "r");

   
//tant qu'on est pas a la fin du fichier :
   
while (!feof($fichier))
    {
   
// On recupere toute la ligne
   
$uneLigne = fgets($fichier, 1024);
   
var_dump($fichier);
   
//On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
   
$tableauValeurs = explode(';', $uneLigne);
   
   
// On crée la requete pour inserer les donner (ici il y a 12 champs donc de [0] a [11])

   
$nid = db_insert('csv_avant') // Table name no longer needs {}
       
->fields(array(
       
'nom'=>$tableauValeurs[0],
       
'prenom'=>$tableauValeurs[1],
       
'categorie'=>$tableauValeurs[2],
    ))
    ->
execute();
     }
    }
    if (isset(
$_FILES['csv_file']) AND $_FILES['csv_file']['error'] == 0)
{
         if (
$_FILES['csv_file']['size'] <= 1000000)
        {
               
// Testons si l'extension est autorisée
               
$infosfichier = pathinfo($_FILES['csv_file']['name']);
               
$extension_upload = $infosfichier['extension'];
               
$extensions_autorisees = array('csv');
                if(
in_array($extension_upload, $extensions_autorisees))
                {
                       
// On peut valider le fichier et le stocker définitivement
                       
move_uploaded_file($_FILES['csv_file']['tmp_name'], 'sites/all/modules/csv' . basename($_FILES['csv_file']['name']));
                        echo
"L'envoi a bien été effectué !";
                }
        }

}
?>
Forum : 
Version de Drupal : 

avant tout je te remercie pour l'aide, j'ai réédité mon code par apport au premier lien

<?php
form
['submit'] = array(
      
'#type' => 'submit',
      
'#value' => t('Envoyer'
       
));
 
  
$form['#attributes']['enctype'] = "multipart/form-data";
  
  
  function
csv_form_validate($form, &$form_state) {
 
// attempt to save the uploaded file
 
$file = file_save_upload('sites/all/modules/csv');
 
// check file uploaded OK
 
if (!$file) {
   
form_set_error('file_upload', t('A file must be uploaded or selected from FTP updates.'));
  }
  else if(
$file->filemime != 'text/csv') {
   
form_set_error('file_upload', t('The file must be of CSV type only.'));
  }
  else {
   
// set files to form_state, to process when form is submitted
   
$form_state['values']['file_upload'] = $file;
  }
}

function
csv_form_submit($form, &$form_state) {
 
$line_max = variable_get('user_import_line_max', 1000);
 
ini_set('auto_detect_line_endings', true);
 
$filepath = $form_state['values']['file_upload']->filepath;
 
$handle = @fopen($filepath, "r");
 
// start count of imports for this upload
 
$send_counter = 0;
  while (
$row = fgetcsv($handle, $line_max, ';')) {
   
// $row is an array of elements in each row
    // e.g. if the first column is the email address of the user, try something like
   
$mail = $row[0];
  }
 
$validators = array('file_validate_extensions' => array('csv'));

   
$file = file_save_upload('file_upload',$validators);


}
?>

mais mon fichier ne s'enregistre pas dans le repertoire indiqué dans la $files.

J'ai un exemple de code que j'utilise pour sauver des fichiers via la contact form, le principe est le même, le fichier est sauvé au bon endroit.
Dans le validate, j'ai:

<?php
>
 
// Save file to Drupal public directory
 
$filepath = 'public://contact_attachments/';
 
file_prepare_directory($filepath, FILE_CREATE_DIRECTORY);
 
$file = file_save_upload('upload', array('file_validate_extensions' => array('png jpg jpeg pdf txt')), $filepath, FILE_EXISTS_RENAME);
  if(!
$file){
   
form_set_error('upload', t('There was an error uploading the file.'));
  }
  else {
   
$file->status = FILE_STATUS_PERMANENT;
   
$file = file_save($file);
   
// Save the file for use in the submit handler.
   
$form_state['storage']['file'] = $file;
  }
?>

Je te remercie pour ce code je les adapté au mien mais le fichier importer ne s'enregistre pas si je comprend bien public://contact_attachement correspond au repertoire de mon module?

Voici le code complet concernant le formulaire

<?php
  $form
['#method'] = 'post';
 
$erreur ='';
 
$form['nom_course']= array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner le nom de la course"),
   
'#description' => t("Renseigner ici le nom de la course à ajouter"),
   
'#default_value' => ''
 
);
 
  
$form['millesime'] = array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner l'année de la course au format '0000'"),
   
'#description' => t("Renseigner ici la date de la course à ajouter"),
   
'#default_value' => ''
    
 
);
   
    
$form['csv']['csv_file'] = array(
   
'#type' => 'file',
   
'#title' => t("charger un fichier csv 'fichier.csv' "),
   
'#description' => t("IMPORTANT : Les entrées du fichier .csv doivent étre séparées par des ' ; ' ."),
   
'#default_value' => ''    
 
);
    
   
  
$form['distance'] = array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner ici la distance"),
   
'#description' => t("Renseigner ici la distance de la course à ajouter"),
   
'#default_value' => ''
 
);
 
  
//champ concernant  l'avant course
  
  
$form  ['labels']['nom']= array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner le nom du coureur"),
   
'#description' => t("Renseigner ici le nom du coureur à ajouter"),
   
'#default_value' => ''
 
);
 
  
$form  ['labels']['prenom'] = array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner le prenom du coureur"),
   
'#description' => t("Renseigner ici le prenom du coureur à ajouter"),
   
'#default_value' => ''
    
 
);
   
  
$form  ['labels']['categorie'] = array(
   
'#type' => 'select',
   
'#title' => t("Renseigner ici la categorie"),
   
'#description' => t("Renseigner ici la categorie de la course à ajouter"),
   
'#default_value' => '',
   
'#options' =>array(
       
1=>'option A',
       
2=>'option A',
       
3=>'option A',
    )
  );
  
$form  ['labels']['nationalite']= array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner la nationalité du coureur"),
   
'#description' => t("Renseigner ici la nationalité du coureur à ajouter"),
   
'#default_value' => ''
 
);
 
  
$form  ['labels']['numeroLicence'] = array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner le numero de licence du coureur"),
   
'#description' => t("Renseigner ici le numero de licence ajouter"),
   
'#default_value' => ''
    
 
);
   
  
$form  ['labels']['dossard'] = array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner ici le numero de dossard ex : 025420."),
   
'#description' => t("Renseigner ici le numero de dossard à ajouter"),
   
'#default_value' => ''
 
);
  
$form  ['labels']['club']= array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner le nom du club"),
   
'#description' => t("Renseigner ici le nom du club à ajouter"),
   
'#default_value' => ''
 
);
 
  
$form  ['labels']['etatInscription'] = array(
   
'#type' => 'textfield',
   
'#title' => t("Renseigner l'etat d'inscription du coureur"),
   
'#description' => t("Renseigner ici l'etat d'inscription du coureur à ajouter"),
   
'#default_value' => ''
    
 
);

  
$form['submit'] = array(
      
'#type' => 'submit',
      
'#value' => t('Envoyer'
       
));
 
  
$form['#attributes']['enctype'] = "multipart/form-data";
  
  
  function
csv_form_validate($form, &$form_state) {
 
// Save file to Drupal public directory
 
$filepath = 'public://contact_attachments/';
 
file_prepare_directory($filepath, FILE_CREATE_DIRECTORY);
 
$file = file_save_upload('upload', array('file_validate_extensions' => array('csv')), $filepath, FILE_EXISTS_RENAME);
  if(!
$file){
   
form_set_error('upload', t('There was an error uploading the file.'));
  }
  else {
   
$file->status = FILE_STATUS_PERMANENT;
   
$file = file_save($file);
   
// Save the file for use in the submit handler.
   
$form_state['storage']['file'] = $file;
  }
}

function
csv_form_submit($form, &$form_state) {
 
$line_max = variable_get('user_import_line_max', 1000);
 
ini_set('auto_detect_line_endings', true);
 
$filepath = $form_state['values']['file_upload']->filepath;
 
$handle = @fopen($filepath, "r");
 
// start count of imports for this upload
 
$send_counter = 0;
  while (
$row = fgetcsv($handle, $line_max, ';')) {
   
// $row is an array of elements in each row
    // e.g. if the first column is the email address of the user, try something like
   
$mail = $row[0];
  }
 
$validators = array('file_validate_extensions' => array('csv'));

   
$file = file_save_upload('file_upload',$validators);


}
  
   if(isset(
$_POST['nom_course']) && isset($_POST['millesime']) && isset($_POST['distance'])) {
       if(
preg_match("#^[0-9]{4,4}$#", $_POST['millesime'])){
  
$nid = db_insert('csv_course') // Table name no longer needs {}
       
->fields(array(
       
'course_name'=>$_POST['nom_course'],
       
'millesime'=>$_POST['millesime'],
       
'distance'=>$_POST['distance'],
    ))
    ->
execute();
     }
   }else{
      
$erreur = 'erreur dans le format de la date respecter la regex suivante : 0000';
   }
  
 
/* 
if(isset($_FILES['[csv_file]'])){
    $files = $_FILES['[csv_file]']['name']['tmp_name'];
    $fichier = fopen($_FILES['csv_file']['tmp_name'], "r");

    //tant qu'on est pas a la fin du fichier :
    while (!feof($fichier))
    {
    // On recupere toute la ligne
    $uneLigne = fgets($fichier, 1024);
    var_dump($fichier);
    //On met dans un tableau les differentes valeurs trouvés (ici séparées par un ';')
    $tableauValeurs = explode(';', $uneLigne);
   
    // On crée la requete pour inserer les donner (ici il y a 12 champs donc de [0] a [11])

    $nid = db_insert('csv_avant') // Table name no longer needs {}
        ->fields(array(
        'nom'=>$tableauValeurs[0],
        'prenom'=>$tableauValeurs[1],
        'categorie'=>$tableauValeurs[2],
    ))
    ->execute();
     }
    }*/
   
      
return system_settings_form($form);
     
    }




/**
 * Add the herp_derp table for the herp module.
 */
function csv_update_7001() {
 
db_create_table('test_csv', drupal_get_schema_unprocessed('csv', 'test_csv'));
  return
'Add the herp_derp table for the herp module.';
}


function
csvErrorMessage(array $error) {
 
$message = t('%type: !message in %function (line ', $error);
 
$this->assertRaw($message, t('Found error message: !message.', array('!message' => $message)));
}
?>

c'est mon tout premier module drupal et c'est un vrai parcourt du combatant mais fort enrichissant! merci d'avance

"public" correspond au répertoire publique de ton installation, que tu peux spécifier dans les options de l'interface d'administration. Par défaut, je pense que c'est sites/all/default/files

Ne re-sauvez pas le fichier dans votre submit, c'est déjà fait a la validation.

Est-ce qu'il est sauvegardé dans votre dossier publique (admin/config/media/file-system) ou pas du tout (dans votre cas, vous avez laissé le "contact_attachments" après public:// donc ce serait dans ce dossier) ? Est-ce qu'il y a une erreur au submit ?

non rien ne s'enregistre à l'envoi du fichier Drupal ne me semble pas travailler,

j'ai supprimé la ligne :

<?php
function csv_form_validate($form, &$form_state) {
 
// Save file to Drupal public directory
 
$filepath = 'public://salut/';
 
file_prepare_directory($filepath, FILE_CREATE_DIRECTORY);
 
$file = file_save_upload('upload', array('file_validate_extensions' => array('csv')), $filepath, FILE_EXISTS_RENAME);
  if(!
$file){
   
form_set_error('upload', t('There was an error uploading the file.'));
  }
  else {
   
$file->status = FILE_STATUS_PERMANENT;
   
$file = file_save($file);
   
// Save the file for use in the submit handler.
   
$form_state['storage']['file'] = $file;
  }
}

function
csv_form_submit($form, &$form_state) {
 
$line_max = variable_get('user_import_line_max', 1000);
 
ini_set('auto_detect_line_endings', true);
 
$handle = @fopen($filepath, "r");
 
// start count of imports for this upload
 
$send_counter = 0;
  while (
$row = fgetcsv($handle, $line_max, ';')) {
   
// $row is an array of elements in each row
    // e.g. if the first column is the email address of the user, try something like
   
$mail = $row[0];
  }
 
$validators = array('file_validate_extensions' => array('csv'));

   
$file = file_save_upload('file_upload',$validators);


}
?>

dans la fonction submit

mais rien ne change, je ne parviens pas à avancé

j'ai rééditer mon code mais sa ne fonctionne toujours pas y'a t'il un conflit sur le fait que j'utilise ce formulaire dans ma function csv_admin_settings()?

<?php
$form
['#attributes'] = array('enctype' => "multipart/form-data");
   
$form['file'] = array(
   
'#type' => 'file',       
   
'#title' => t("charger un fichier csv 'fichier.csv' "),
   
'#description' => t("IMPORTANT : Les entrées du fichier .csv doivent étre séparées par des ' ; ' ."),
   
'#default_value' => ''          
 
); 
   
  
$form['submit'] = array(
      
'#type' => 'submit',
      
'#value' => t('Envoyer')
       );
 
function
csv_form_validate(){
   
$file = file_save_upload('file', array(
   
'file_validate_is_image' => array(),
   
'file_validate_extensions' => array('csv'),
    ));
    if (
$file) {
    if (
$file = file_move($file, 'public://')) {
   
$form_state['values']['file'] = $file;
    }
    else {
   
form_set_error('file', t('Failed to write the uploaded file the site\'s file folder.'));
    }
    }
    else {
   
form_set_error('file', t('No file was uploaded.'));
    }
    }



function
csv_form_submit($form, &$form_state){

$file=$form_state['values']['file'];
unset(
$form_state['values']['file']);
$file->status = FILE_STATUS_PERMANENT;
file_save($file);
drupal_set_message(t('The form has been submitted and the image has been saved, filename: @filename.', array('@filename' => $file->filename)));

}
?>

et Bingo c'était bien sa,

je tenté d'uploader et de sauvegarder un fichier à partir de la function admin_setting faute de droit j'ai créer une fonction dépendante d'un nouvelle items,

et sa fonctionne mais comment pourrai t'ons integrer l'items dans la page de configuration ?

Je rectifie le souci que j'avais c'est que je n'ai pas nommé ma function d'enregistrement comme mon items admin_setting, Donc une erreur de débutant,

soit :

<?php
function csv_admin_settings_validate($form, &$form_state) {
 
$file = file_save_upload('file', array(
     
'file_validate_extensions' => array('csv'),
  ));
  if (
$file) {
    if (
$file = file_move($file, 'public://')) {
     
$form_state['values']['file'] = $file;
    }
    else {
     
form_set_error('file', t("Echec de l'enregistrement du fichier."));
    }
  }
  else {
   
form_set_error('file', t(''));
  }
}

function
csv_admin_settings_submit($form, &$form_state) {
 
$file=$form_state['values']['file'];
  unset(
$form_state['values']['file']);
 
$file->status = FILE_STATUS_PERMANENT;
 
file_save($file);
 
drupal_set_message(t('Le fichier à bien été enregistré', array('@filename' => $file->filename)));
}
?>

Merci pour l'aide en tout cas