Upload d'un fichier, comment faire ? [Réglé]
janus57 Membre non connecté
-
Booster Fusée
- Voir le profil du membre janus57
- Inscrit le : 07/12/2007
- Groupes :
-
Equipe Assistance
voici ma petite problématique à laquelle je n'arrive pas à trouver de réponse "claire" dans les différents modules/codes de PHPBoost.
Je cherche à traité l'upload d'un fichier.
Au niveau du fieldset j'ai ce code :
Code PHP :
$fieldset->add_field(new FormFieldFilePicker('track_file', $this->lang['form_track_file'], array( 'description' => $this->lang['form_track_file_desc'])
Par contre plus loin, pour l'enregistrement du fichier sur le serveur je sèche, car je vois qu'on peu utiliser ce code (pris au niveau de l'upload de fichier via la partie membre)
Code PHP :
if (is_writable($dir)) //Dossier en écriture, upload possible { $weight_max = $unlimited_data ? 100000000 : ($group_limit - $member_memory_used); $Upload = new Upload($dir); $Upload->file('upload_file', '`([a-z0-9()_-])+.(' . implode('|', array_map('preg_quote', $files_upload_config->get_authorized_extensions())) . ')+$`i', Upload::UNIQ_NAME, $weight_max); if ($Upload->get_error() != '') //Erreur, on arrête ici { $error = $Upload->get_error(); if ($Upload->get_error() == 'e_upload_max_weight') $error = 'e_max_data_reach'; AppContext::get_response()->redirect('/user/upload.php?f=' . $folder . '&erroru=' . $error . '&' . $popup_noamp . '#message_helper'); } else //Insertion dans la bdd { $Sql->query_inject("INSERT INTO " . DB_TABLE_UPLOAD . " (idcat, name, path, user_id, size, type, timestamp) VALUES ('" . $folder . "', '" . addslashes($Upload->get_original_filename()) . "', '" . addslashes($Upload->get_filename()) . "', '" . $User->get_attribute('user_id') . "', '" . $Upload->get_human_readable_size() . "', '" . $Upload->get_extension() . "', '" . time() . "')", __LINE__, __FILE__); } }
Donc si j'ai bien compris ce code c'est $Upload->file qui permet l'enregistrement.
Mais j'ai aussi trouvé ce code (dans le module partner de @MrToine)
Code PHP :
if($file !== null) { $file->save(new File(PATH_TO_ROOT.'/partners/banner.png')); }
Donc ma problématique est quel code ou du moins quel fonction utilisé, sachant que le fichier envoyé par l'utilisateur ne doit pas avoir d'espace ainsi que de caractères spéciaux dans son nom, et sera renommé à la volé sous cette forme : filename_TRACK-ID.FILE-EXTENSION
Ce qui par exemple pourrait donner pour l'utilisateur qui upload le fichier N°154 : 154_Metz.gps, sachant que les 153 autre fichier ont été upload par d'autre membre.
Mon but étant de n'avoir aucun fichier identique (niveau nom) ainsi qu'une "convention" de nommage pour rapidement identifier un fichier.
Donc j'avais commencé avec ce code :
Code PHP :
private function upload_track() { $user = AppContext::get_current_user()->get_id(); @clearstatcache(); // pour upload sur la forme /tracks_files/ID_USER/les_fichiers du user ID_USER $folder_track = PATH_TO_ROOT.'/tracks_files/'.$user.'/'; if (!is_writable($folder_track)) { $chmod = array('0644', '0664', '0666', '0744', '0764', '0766', '0777'); $i = 0; while (!is_writable($folder_track)) { $is_writable = @chmod($folder_track, $chmod[$i]); $i++; } unset($i); } else { $is_writable = true; } @clearstatcache(); if ($is_writable) { $uploaded_file = $this->form->get_value('track_file'); if ($uploaded_file !== null) { $upload = new Upload($folder_track); if ($upload->file('upload_track_track_file', '`([a-zA-Z0-9_]+).(gpx|kml)+$`i')) { if ($upload->get_extension() == 'gpx') { /* que faire ici pour l'enregistrer ? */ } elseif ($upload->get_extension() == 'kml') { //include_once(PATH_TO_ROOT . '/tracks/lib/'); à definir /* Traitement du KML */ } } } } else { $this->view->put('MSG', MessageHelper::display('Erreur inattendu lors du traitement, contacter un admin', MessageHelper::NOTICE, 5)); } }
Mais du coup je sais pas quoi faire après, donc si un dev's a 5minutes sous la main pour m'expliquer ce serait gentil.
EDIT :
Ah oui en prime je doit renseigner le chemin du fichier dans la BDD, mais je suppose que je peu l'intégrer dans "private function save" non ?
Cordialement, janus57
Édité par janus57 Le 06/01/2015 à 17h29
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement

La classe Upload est dépréciée et ne doit plus être plus être utilisée.
Ensuite si tu veux supprimer les caractères spéciaux tu peux utiliser la fonction Url::encode_rewrite().
janus57 Membre non connecté
-
Booster Fusée
- Voir le profil du membre janus57
- Inscrit le : 07/12/2007
- Groupes :
-
Equipe Assistance
ok du coup y a pas une doc avec une class non déprécié et présent en V4.0 ?
Car j'ai essayé de voir comment fonctionne "$file->save(new File ())" mais j'ai pas trouvé de doc claire ou de module qui l'utilise pour renseigner des infos du fichier en BDD par la suite.
Car là pour ma part c'est le bordel pour faire un module j'arrive pas à trouver de doc et je doit vous poser des question toute les 2fonctions pour en savoir plus :/
Du coup je comprend pourquoi y a pas des masse de module, je sais aussi que vous êtes pas beaucoup, mais cela m'énerve de faire quelque chose pour apprendre par la suite que ce code est déprécié et ne doit plus être utilisé.
EDIT :
edit effacé
Cordialement, janus57
Édité par janus57 Le 09/01/2015 à 14h35
janus57 Membre non connecté
-
Booster Fusée
- Voir le profil du membre janus57
- Inscrit le : 07/12/2007
- Groupes :
-
Equipe Assistance
bon j'ai un peu regardé a tête reposé le tout, mais y a un truc que je trouve "bizarre" ou du moins que je retrouve en double.
Exemple :
Pour "regarder" c'est quoi l'extension d'un fichier, on doit utiliser quoi ?
Ce code (extrait et modifié de AdminCustomizeInterfaceController.class.php).
Code PHP :
Ou il faut utiliser ce code :
Code PHP :
$header_logo = $this->form->get_value('header_logo', null); $file = new File($header_logo->get_name()); if ($file->get_extension() == 'type') { // instructions }
Car les 2class (FileType et "File extends FileSystemElement") dispose de la méthode "get_extension".
Cordialement, janus57
janus57 Membre non connecté
-
Booster Fusée
- Voir le profil du membre janus57
- Inscrit le : 07/12/2007
- Groupes :
-
Equipe Assistance
petit up pour que je puisse avancer.
Cordialement, janus57
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement

Tu peux utiliser les deux, le premier exemple permet de connaitre également quel type de fichier c'est (image, vidéo, ... )
janus57 Membre non connecté
-
Booster Fusée
- Voir le profil du membre janus57
- Inscrit le : 07/12/2007
- Groupes :
-
Equipe Assistance
donc les 2 solutions donnée plus haut sont valide en 4.0 et 4.1 et seront valide en V4.2 ?
Cordialement, janus57
ReidLos Membre non connecté
-
Modérateur
- Voir le profil du membre ReidLos
- Inscrit le : 27/02/2009
- Site internet
- Groupes :
-
Equipe Développement
janus57 Membre non connecté
-
Booster Fusée
- Voir le profil du membre janus57
- Inscrit le : 07/12/2007
- Groupes :
-
Equipe Assistance
le code N°2 ne fonctionne pas en V4.0 pour info.
Donc j'utilise le N°1
Cordialement, janus57
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie