uploader différents formats de fichier

Par tikoum, il y a 8 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.
j'ai suivi le tutoriel un site de A à Z en 7 jours de Grafikart et j'essaye d'aller un peu plus loin. Aussi, je sollicite votre aide.

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire
Je voudrais uploder des fichiers avec des formats différents. Actuellement seul les JPEG sont bien uploadés. Voici le code qui se trouve ds class MediasController

Entourez votre code pour bien le mettre en forme function admin_index($id){ $this->loadModel('Media'); if($this->request->data && !empty($_FILES['file']['name'])){ //var_dump($_FILES); if(strpos($_FILES['file']['type'], 'image') !== false){ $dir = WEBROOT.DS.'img'.DS.date('Y-m'); if(!file_exists($dir)) mkdir($dir, 0777);// si le fichier n'existe pas, on le crée move_uploaded_file($_FILES['file']['tmp_name'],$dir.DS.$_FILES['file']['name']); $this->Media->save(array(//sauvegarde 'name' => $this->request->data->name,//nom de l'image 'file' => date('Y-m').'/'.$_FILES['file']['name'],//nom du dossier et du fichier 'post_id' => $id, 'type' => 'img' )); $this->Session->setFlash("L'image a bien été uploadé"); }else{ $this->Form->errors['file'] = " Format refusé"; } } //debug($_FILES); $this->layout = 'modal'; $d['images'] = $this->Media->find(array( 'conditions' => array('post_id' => $id ))); $d['post_id'] = $id; $this->set($d); }

Ce que je veux

Décrivez ici ce que vous cherchez à obtenir
Je voudrais uploader des fichiers aux formats les plus courant : PDF, doc, xls, tiff.

Ce que j'obtiens

"Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(
J'ai essayé de toucher au "type" mais j'ai toujours format refusé. Merci pour votre. Je suis plutôt débutant.

27 réponses

tikoum, il y a 8 ans

Ouf je désespérais d'une réponse. Merci Carouge.
Je ne suis pas développeur à la base, mais si j'ai bien compris il faut que je reprenne l'expression :
et que j'y injecte par exemple un elseif à chaque itération comme ceci:
if(strpos($_FILES['file']['type'], 'image') !== false)elseif{
if(strpos($_FILES['file']['type'], 'PDF') !== false)elseif{
if(strpos($_FILES['file']['type'], 'doc') !== false)elseif{
}
}
}
en fonction du type de format?

Carouge10, il y a 8 ans

Bonsoir,
Il te faut modifier cette partie :

if(strpos($_FILES['file']['type'], 'image') !== false){

en faisant par exemple un switch case avec chaque cas
ou un elseif pour chaque cas.

tikoum, il y a 8 ans

Merci, je connaissais pas cette subtilité.

SLK, il y a 8 ans

Salut,

Oui, tu peux faire comme tu dis, mais c'est un peu "lourd".

En général on fait plutôt comme ça :

// on met tout ce qu'on accepte dans un tableau $allowed_types = array("image", "PDF", "doc"); // et on vérifie juste si le type qu'on récupère est dans le tableau ou pas if (in_array($_FILES['file']['type'], $allowed_types)) { // type autorisé } else { $this->Form->errors['file'] = "Format refusé"; }
Carouge10, il y a 8 ans

Hormis le fait qu'il ne vas pas trouver d'image quand tu publies un pdf par exemple, tu devrais avoir le nom du fichier pour tout tes documents ?

tikoum, il y a 8 ans

Oui, dans mon portfolio. Mais au niveau du site, c'est un cadre transparent.

tikoum, il y a 8 ans

Dans mon portfolio aussi, l'image est transparente.

Carouge10, il y a 8 ans

Donc nous avons bien la liste des documents que tu envoies.
Maintenant il te faut améliorer le "foreach" pour afficher correctement les miniatures en fonction du type de fichier.

tikoum, il y a 8 ans

Bonjour SLK. Merci pour ton message.
J'ai essayé en appliquant toutes les variantes à partir de ta proposition et j'ai toujours la même erreur:
Notice: Undefined variable: allowed_types in C:\wamp\www\test\controller\MediasController.php on line 10.

PS: Voici le var_dump:
array (size=1)
'file' =>
array (size=5)
'name' => string 'facture_FR17949661.pdf' (length=22)
'type' => string 'application/pdf' (length=15)
'tmp_name' => string 'C:\wamp\tmp\phpC02C.tmp' (length=23)
'error' => int 0
'size' => int 108911

Carouge10, il y a 8 ans

Et bien ajoute dans $allowed_types, "application/pdf" et tu pourras envoyer des pdf.

tikoum, il y a 8 ans

Merci, ça fonctionne.
En revanche si je peux voir l'image quand j'uploade un jpeg, je ne vois pas le logo pdf (d'ailleurs on ne peut pas non plus l'ouvrir), y-a-t-il une syntaxe à rajouter ? Merci d'avance pour ton retour.

Carouge10, il y a 8 ans

La c'est autre chose et il faudrait voir comment ton modal liste les éléments.

tikoum, il y a 8 ans

<table>
<head>
<tr>
<th>Images</th>
<th>Titre</th>
<th>Actions</th>
</tr>
</head>
<body>
<?php foreach ($images as $k => $v): ?>
<tr>
<td>
<a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
<img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
</a>
</td>
<td><?php echo $v->name; ?></td>
<td>
<a onclick = "return confirm('Voulez vous vraiment supprimer cette image?');
"href = "<?php echo Router::url('admin/medias/delete/'.$v->id);?>">Supprimer</a>
</td>
</tr>
<?php endforeach ?>
</body>
</table>

<div class ="page-header">
<h1>Ajouter une image</h1>
</div>

<form action="<?php echo Router::url('admin/medias/index/'.$post_id); ?>" method="post" enctype="multipart/form-data">
<?php echo $this->Form->input('file','Image',array('type'=>'file'));//nom, label et type ?>
<?php echo $this->Form->input('name','Titre');//nom et Titre ?>
<br/>
<div class="actions">
<input type="submit" class="btn btn-primary" value="Envoyer">
</div>
</form>

Voici ma vue ci dessus (sans doute ce que qui correspond peut être à ce que tu appelles modal )
Je me demande si je ne suis restreint par le type => 'img' du MediasController que l'on retrouve également dans la vue ?

Carouge10, il y a 8 ans

c'est possible aussi

tikoum, il y a 8 ans

bizarre la présentation du code. Je n'arrive pas à faire mieux hélas.

tikoum, il y a 8 ans

cette partie de code de la vue correspond au chemin
<a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
<img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
</a>
et je ne crois pas que le problème vienne de là, mais effectivement plus du type => 'img' du MediasController au moment de la sauvegarde. Toutefois, je ne sais pas comment remédier au problème????

Carouge10, il y a 8 ans

tu peux mettre le code qui liste tes images dans ta vue ?

tikoum, il y a 8 ans

J'ai essayé plusieurs fois mais ça ne marche pas. Nouvel essai.

<table>
<head>
<tr>
<th>Images</th>
<th>Titre</th>
<th>Actions</th>
</tr>
</head>
<body>
<?php foreach ($images as $k => $v): ?>
<tr>
<td>
<a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
<img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
</a>
</td>
<td><?php echo $v->name; ?></td>
<td>
<a onclick = "return confirm('Voulez vous vraiment supprimer cette image?');
"href = "<?php echo Router::url('admin/medias/delete/'.$v->id);?>">Supprimer</a>
</td>
</tr>
<?php endforeach ?>
</body>
</table>

<div class ="page-header">
<h1>Ajouter une image</h1>
</div>

<form action="<?php echo Router::url('admin/medias/index/'.$post_id); ?>" method="post" enctype="multipart/form-data">
<?php echo $this->Form->input('file','Image',array('type'=>'file'));//nom, label et type ?>
<?php echo $this->Form->input('name','Titre');//nom et Titre ?>
<br/>
<div class="actions">
<input type="submit" class="btn btn-primary" value="Envoyer">
</div>
</form>

tikoum, il y a 8 ans

On voit juste les 3 première lignes.

tikoum, il y a 8 ans

<?php foreach ($images as $k => $v): ?>
<tr>
<td>
<a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')">
<img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60">
</a>
</td>
<td><?php echo $v->name; ?></td>
<td>
<a onclick = "return confirm('Voulez vous vraiment supprimer cette image?');
"href = "<?php echo Router::url('admin/medias/delete/'.$v->id);?>">Supprimer</a>
</td>
</tr>
<?php endforeach ?>

    Je poste la partie la plus intéressante.
tikoum, il y a 8 ans

Même 8 lignes ça marche pas. quelle galère!!!!!

Carouge10, il y a 8 ans

Il serait bien que tu utilise la balise </ > pour mettre en forme le code car là c'est illisible

tikoum, il y a 8 ans
<table> <head> <tr> <th>Images</th> <th>Titre</th> <th>Actions</th> </tr> </head> <body> <?php foreach ($images as $k => $v): ?> <tr> <td> <a href="#" onclick="FileBrowserDialogue.sendURL('<?php echo Router::webroot('img/'.$v->file); ?>')"> <img src = "<?php echo Router::webroot('img/'.$v->file); ?>" height="60"> </a> </td> <td><?php echo $v->name; ?></td> <td> <a onclick = "return confirm('Voulez vous vraiment supprimer cette image?'); "href = "<?php echo Router::url('admin/medias/delete/'.$v->id);?>">Supprimer</a> </td> </tr> <?php endforeach ?> </body> </table> <div class ="page-header"> <h1>Ajouter une image</h1> </div> <form action="<?php echo Router::url('admin/medias/index/'.$post_id); ?>" method="post" enctype="multipart/form-data"> <?php echo $this->Form->input('file','Image',array('type'=>'file'));//nom, label et type ?> <?php echo $this->Form->input('name','Titre');//nom et Titre ?> <br/> Voila<div class="actions"> <input type="submit" class="btn btn-primary" value="Envoyer"> </div> </form>
tikoum, il y a 8 ans

Ok, je vais travailler dans cette direction, je te tiendrais informé. En tout cas Merci bcp.

Carouge10, il y a 8 ans

Je t'en pris.
Tu pourras poster le code, cela pourra aider d'autres personnes.

Joey Pharrel Mekoum, il y a 6 ans

bonjour chers tous jai suivi le tuto de grafikart (develpper un site de A à Z) qui étais vraiment genial but mon soucis est que je veux modifier le code pour uploader les fichiers video mais je n'y arrive ! pouvez s'il vous plais m'aider grafikart je suis meme pret a devenir membre premium pour soutenir le beau travail que tu fais ! merci bien ! c'est urgent

class MediasController extends Controller{

function admin_index($id){
    $this->loadModel('Media');
    if($this->request->data && !empty($_FILES['file']['name'])){
        if(strpos($_FILES['file']['type'], 'image') !== false){
            $dir = WEBROOT.DS.'img'.DS.date('Y-m');
            if(!file_exists($dir)) mkdir($dir,0777);
            move_uploaded_file($_FILES['file']['tmp_name'],$dir.DS.$_FILES['file']['name']);
            $this->Media->save(array('name' => $this->request->data->name, 'file' => date('Y-m').'/'.$_FILES['file']['name'], 'post_id' => $id, 'type' => 'img'));
            $this->Session->setFlash("L'image a bie été uploadé");
        }else{
            $this->Form->errors['file'] = "Le fichier n'est pas une image";
        }
    }
    $this->layout = 'Modal';
    $d['images'] = $this->Media->find(array('conditions' => array('post_id' => $id)));
    $d['post_id'] = $id;
    $this->set($d);
}

function admin_delete($id){
    $this->loadModel('Media');
    $media = $this->Media->findFirst(array('conditions' => array('id'=>$id)));
    unlink(WEBROOT.DS.'img'.DS.$media->file);
    $this->Media->delete($id);
    $this->Session->setFlash("Le media a bien été supprimé");
    $this->redirect('admin/medias/index/'.$media->post_id);
}

}

Carouge10, il y a 6 ans

Bonjour,
Et si tu commençais par crée ton propre sujet au lieu d'être sur un vieu de 3 ans ?