Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Ci-dessous mon code pour l'upload d'un fichier :
[lang=php] public function getInputFilterSpecification() { return array( 'documentFile' => array( 'required' => false, 'filters' => array( array( 'name' => 'filerenameupload', 'options' => array( 'target' => './www/media/news/docs/', 'use_upload_name' => true, 'randomize' => true ) ) ) ) }
Donc là ça marche plutôt bien, j'utilise le code ci-dessous pour générer un nom de fichier unique :
[lang=php] 'use_upload_name' => true, 'randomize' => true
Le problème est que je n'arrive pas à récupérer proprement le nom de fichier généré pour le stocker en base.
Je me demande du coup si je devrais pas le faire autrement ? Qu'en pensez-vous ?
Quel serait le best practice ?
Aussi dans quel dossier rangeriez-vous les fichiers uploadés par les users ? Pour ma part je les stocke dans le document root /media
Merci d'avance
Hors ligne
Hello,
Quand tu dis tu ne parviens pas à récupérer le nom du fichier généré proprement, comment fais tu actuellement ?
Aussi dans quel dossier rangeriez-vous les fichiers uploadés par les users ? Pour ma part je les stocke dans le document root /media
A toi de choisir Pour ma par j'ai un dossier data sur la root de mon application et dedans je met un dossier upload.
Après à toi de voir comment tu souhaites gérer ca...
Hors ligne
YannickDa a écrit:
Quand tu dis tu ne parviens pas à récupérer le nom du fichier généré proprement, comment fais tu actuellement ?
Il faut regarder à la ligne 170 du fichier \Zend\Filter\File\RenameUpload, il stocke le resultat dans $return['tmp_name'] = $targetFile;
Donc il faut faire un getInputFilter() pour récupérer le bon filter et trouver le bon filtre, et encore il ne retourne pas le nom du fichier mais le chemin complet et le chemin ne me plait pas, il faut le retravailler, bref pas élégant je trouve. J'ai l'impression que c'est pas adapté à mes besoins cette méthode.
YannickDa a écrit:
A toi de choisir
Pour ma par j'ai un dossier data sur la root de mon application et dedans je met un dossier upload.
Après à toi de voir comment tu souhaites gérer ca...
Mais le problème est que si je le stocke dans "data/upload", le fichier ne sera pas accessible au public non ?
Il faudra alors configurer apache dans ce cas ? Dans le cas d'un serveur en Mutu c'est pas trop possible
Hors ligne
Salut, tu peux directement mettre les fichiers dans le dossier public de ton application. Tu fais un sous dossier pour le mettre dedans. Après à toi de faire en sorte que le répertoire ne puisse pas lister ses fichiers. Si les noms sont uniques faut être motivé pour trouver les fichiers .
Hors ligne
Bonjour Orkin,
Je penses que tu parles d'autres choses là, ce n'est pas ce que je demandais.
Pour l'emplacement, je demandais juste comme ça, juste pour savoir ou avait la place des fichiers uploadé par les utilisateurs dans la structure de l'appli. Effectivement dans le dossier data/ ça me plait aussi mais je pense que là du coup faut jouer avec la conf d'apache.
Pour le nom unique, c'est lors de l'upload, si un utilisateur poste un fichier qui a un même nom de fichier déjà uploadé, ça posera problème forcement. Pas grave si les fichiers sont listés ou non pour l'instant.
Je cherche donc un moyen d'uploadé un fichier avec un nom unique avec ZF2, pouvoir récupérer ce nom pour le stocké en base.
Merci
Hors ligne
Je viens de survoler rapidement la documentation sur le fileupload et visiblement tu ne peux récupérer les informations du fichier (nom etc ...) généré par les filtres et validateur qu'à partir de l'inputfilter.
Tu as des exemples d'utilisation assez complet par l'auteur du composant ici : https://github.com/cgmartin/ZF2FileUploadExamples
Hors ligne
alien7 a écrit:
YannickDa a écrit:
Quand tu dis tu ne parviens pas à récupérer le nom du fichier généré proprement, comment fais tu actuellement ?
Il faut regarder à la ligne 170 du fichier \Zend\Filter\File\RenameUpload, il stocke le resultat dans $return['tmp_name'] = $targetFile;
Donc il faut faire un getInputFilter() pour récupérer le bon filter et trouver le bon filtre, et encore il ne retourne pas le nom du fichier mais le chemin complet et le chemin ne me plait pas, il faut le retravailler, bref pas élégant je trouve. J'ai l'impression que c'est pas adapté à mes besoins cette méthode.
En faite tu peux faire quelque chose de bien plus simple. Une fois que tu as validé ton formulaire, tu récupère les valeurs grâce à la méthode getData() de ton form puis tu regarde dans ce retour le nom de ton champs d'upload et tu verra qu'il y a les infos de ton fichier uploadé...
alien7 a écrit:
YannickDa a écrit:
A toi de choisir
Pour ma par j'ai un dossier data sur la root de mon application et dedans je met un dossier upload.
Après à toi de voir comment tu souhaites gérer ca...Mais le problème est que si je le stocke dans "data/upload", le fichier ne sera pas accessible au public non ?
Il faudra alors configurer apache dans ce cas ? Dans le cas d'un serveur en Mutu c'est pas trop possible
En fait j'ai oublié de préciser un point : Tout dépend de tes besoins. Si ces fichiers sont destinés à être téléchargés uniquement par certaine personne (donc tu as besoins d'un contrôle sur l'utilisateur qui télécharge), tu peux te créer un controller qui va s'occuper de distribuer le fichier en allant le chercher dans le rep data. Sinon, si tu n'as pas besoin de cette mécanique, comme le dit Orkin, met le dans le dossier public tu t'embêtera bien moins... Ou si tu veux absolument le mettre dans le rep data, alors créer toi un controller qui va s'occuper de distribuer les fichiers...
Hors ligne
Le problème est que $form->getData() me renvoit un object (J'utilise Doctrine) donc quand je fais un var_dump($form->getData()) firefox mouline du coup impossible de lire la variable trop d'information, donc je ne sais pas ou aller chercher l'info.
Je fais comme ceci :
[lang=php] $inputFilter = $form->getInputFilter(); $filters = $inputFilter->getValues(); // j'ai essayé comme ceci : $inputFilter = $form->getInputFilter(); $filter = $inputFilter->getValue('documentFile'); // mais ca ne marche pas, je ne sais pas pourquoi
Sinon j'obtiens ca:
'name' => string 'home_screenshot.png' (length=19) 'type' => string 'image/png' (length=9) 'tmp_name' => string './www/media/news/docs/home_screenshot_51681532ee396.png' (length=59) 'error' => int 0 'size' => int 677961
Ensuite je dois faire un basename pour récupérer le nom du fichier. C'est pas jolie.
Je vais continuer comme ça pour le moment.
Merci à tous
Hors ligne
Et l'objet que te retourne le getData, il contient pas le champs du fichier uploadé ?
Il n'y a pas de propriété "documentFile" ? Si c'est le cas, si tu fait un get sur cette propriété il te retourne quoi ?
S'il y en a pas, tu as toujours la possibilité de retrouver les valeurs filtrés par Zend en envoyant le flag \Zend\Form\FormInterface::VALUES_AS_ARRAY à la méthode getData....
Hors ligne