upload multiple laravel 5.4

Par Youssef Boudaya, il y a 9 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Voici le code de la vue {!! Form::open(array('action' => 'ArticlecommentController@store', 'method' => 'post', 'class' => 'contact-form', 'role' => 'form')) !!} <input type="hidden" name="user_id" value="1"> <input type="hidden" name="article_id" value="{{ $article->id }}"> <div class="form-group m-b-20"> <input type="file" name="files[]" id="filer_input1" multiple="multiple" > </div> {!! Form::close() !!} et mon controlleur: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Articlefile; use App\Article; use Illuminate\Support\Facades\Session; class ArticlefileController extends Controller { public function store(Request $request) { if($request->hasFile('files')){ foreach ($request->file('files') as $key => $value) { $path = 'uploads/articles'; $fichier = New Articlefile(); $fichier->article_id = $article->id; $file->move('uploads' , $file->getClientOriginalName()); $file->getClientOriginalName(); } return redirect('articles/'.$request->article_id); } }

Ce que je veux

je n'arrive pas a uploader mes fichiers

Ce que j'obtiens

Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

16 réponses

Tarik El Jabiri, il y a 9 ans

salut,
je vois le variable $article n'est pas defini

Youssef Boudaya, il y a 9 ans

oui j'ai deja changé mon code :

{!! Form::open(array('action' => 'ArticleController@store', 'method' => 'post' )) !!}

                                        <input type="hidden" name="user_id" value="1">
                                        <div class="form-group m-b-20">
                                            <label for="exampleInputEmail1">Titre</label>
                                            <input type="text" class="form-control" name='title' id="exampleInputEmail1" placeholder="Saisir titre">
                                        </div>

                                        <div class="form-group m-b-20">
                                            <label for="videourl">Video URL</label>
                                            <input type="text" name="video_link" class="form-control" id="videourl" placeholder="Saisir url..">
                                        </div>

                                        <div class="form-group m-b-20">
                                            <input type="file" name="files[]"  multiple="multiple" >
                                        </div>
                                       <div class="form-group m-b-20">
                                            <label>Description</label>
                                            <textarea class="summernote" name="description"></textarea>
                                        </div>

                                        <button type="submit" class="btn btn-success waves-effect waves-light">Enregistrer et publier</button>
                                        <button type="button" class="btn btn-danger waves-effect waves-light">Annuler</button>
                                    {!! Form::close() !!}

et dans le controlleur:

public function store(Request $request)
{
Article::create($request->all());

    $article = New Article();
    $article->user_id = $request->get('user_id');
    $article->title = $request->get('title');
    $article->description = $request->get('description');
    $article->save();

    if($request->hasFile('files')):
        foreach ($request->file('files') as $file) :
            $path = '../articles/uploads';
            $titre = $file->getClientOriginalName();
            $file->move($path, $titre);
            $fichier = New Articlefile();
            $fichier->article_id = $article->id;
            $fichier->title = $title;
            $fichier->path = $path;
            $fichier->save();

     endforeach;

endif;

    return redirect('articles');
}
betaWeb, il y a 9 ans

Salut,

Tu as fais un dd($request->file('files')) voir si tu as bien les infos sur les fichiers que tu souhaites envoyer ?
De plus, quand tu dis "ça marche pas", tu parles de l'upload des fichiers ? De la persistance de tes data en BD ? Du redirect ? D'autre chose ?

Youssef Boudaya, il y a 9 ans

je parle de l'upload des fichiers .j'ai changé le code de mon controlleur a ça

public function store(Request $request) { $article = New Article(); $article->user_id = $request->get('user_id'); $article->title = $request->get('title'); $article->description = $request->get('description'); $article->save(); if($request->hasFile('files')){ foreach ($request->file('files') as $file){ $path = 'uploads/articles/'; $extension = $file->getClientOriginalExtension(); $titre = $file->getClientOriginalName(); $filename = str_random(4).'_'.$titre.'.'.$extension; $file->move($path, $filename); $fichier = New Articlefile(); $fichier->article_id = $article->id; $fichier->title = $title; $fichier->path = $path.'/'.$filename; $fichier->save(); } } return redirect('articles'); }
betaWeb, il y a 9 ans

Tu as bien les permissions en écriture pour le dossier dans lequel tu souhaites move tes fichiers ?
Et je pense que le chemin est faux : s'il se trouve dans ton dossier public, tu dois utiliser le helper $path = public_path() . '/uploads/articles' (à moins que tu aies configurer les chemins dans le fichier de config storage.php ?)

Youssef Boudaya, il y a 9 ans

comment je sais si j'ai les permissions en ecritutre?
oui il se trouve sous le dossier public (C:\xampp\htdocs\projet\public\uploads\articles) j'ai changé le path mais rien n'est enregistre dans ma table

betaWeb, il y a 9 ans

Laravel te retourne une erreur ?
Si tu utilises Laravel 5.1+, essaye ceci (non testé) :

use \Exception; public function store (Request $request, Exception $exception) { // ... if (!$file->move($path, $filename)) { return parent::render($request, $exception); } // ... }

Après, je ne sais pas d'où vient la méthode move, c'est une méthode de ton modèle ?
Jette un oeil à ceci : https://laravel.com/docs/5.4/requests#files

Sinon, tu peux utiliser un simple try/catch voir si la méthode move ne renvoie pas d'exception.

Si tu utilises Laravel 5.3+, jette un oeil au File Storage.

kndeye, il y a 9 ans

Bonjour,
enctype="multipart/form-data" ??? Tu as ça dans ton formulaire?

Youssef Boudaya, il y a 9 ans

oui {!! Form::open(array('action' => 'ArticleController@store', 'method' => 'post','files'=>'true' ,'enctype'=>'multipart/form-data' )) !!}

kndeye, il y a 9 ans

Hum, quand tu fais

<input type="file" name="files[]" multiple="multiple" >

ton $request->get('files') sera un tableau et non un objet de type File, de ce fait ta condition

if($request->hasFile('files'))

retournera toujours false. Ce que tu peux essayer c'est faire un foreach sur $request->get('files') pour chaque file tu fais ta condition if($file->hasFile('files'))

foreach ($request->get('files') as $file){ if($request->hasFile($file)){ //Le code pour uploader les fichiers } }

que j'ai jamais testé, oubien

foreach ($request->get('files') as $file){ if(is_object($file) && $file->isValid()){ //Le code pour uploader les fichiers } }
Youssef Boudaya, il y a 9 ans

j'ai changé mon code à ça c'est correcte? (je suis un debutant)

public function store(Request $request)
{

    $article = New Article();
    $article->user_id = $request->get('user_id');
    $article->title = $request->get('title');
    $article->description = $request->get('description');
    $article->save();

   $request->file('files'); 
     foreach ($request as $file){
    if($request->hasFile('files')){

            $path = public_path() . '/uploads/articles';
            $extension = $file->getClientOriginalExtension();
            $titre = $file->getClientOriginalName();
            $filename = str_random(4).'_'.$titre.'.'.$extension;
            $file->move($path, $filename);
            $fichier = New Articlefile();
            $fichier->article_id = $article->id;
            $fichier->title = $title;
            $fichier->path = $path.'/'.$filename;
            $fichier->save();
        }
    }
    return redirect('articles');
}
kndeye, il y a 9 ans

Change ton

$request->file('files'); foreach ($request as $file){ if($request->hasFile('files')){ }

en

foreach ($request->get('files') as $file){ if(is_object($file) && $file->isValid()){ //Le code pour uploader les fichiers } }

et testes pour voir si ça marche

Youssef Boudaya, il y a 9 ans

j'ai changé mon controlleur à ça

public function store(Request $request) { $article = New Article(); $article->user_id = $request->get('user_id'); $article->title = $request->get('titre'); $article->description = $request->get('description'); $article->save(); foreach ($request->get('files') as $file){ if(is_object($file) && $file->isValid()){ $path = public_path() . '/uploads/articles'; $extension = $file->getClientOriginalExtension(); $titre = $file->getClientOriginalName(); $filename = str_random(4).'_'.$titre.'.'.$extension; $file->move($path, $file->getClientOriginalName()); } } return redirect('articles'); }

mais quand je veux acceder a la page de creation ça me donne cette erreur:ErrorException in HtmlBuilder.php line 464:
Array to string conversion (View: C:\xampp\htdocs\projet\resources\views\articles\create.blade.php)
voici la vue:

<div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="p-20"> <div class=""> {!! Form::open(array('action' => 'ArticleController@store', ['method' => 'post'],['files'=>'true'] ,['enctype'=>'multipart/form-data'] )) !!} <input type="hidden" name="user_id" value="{{ Auth::user()->id }}"> <div class="form-group m-b-20"> <label for="exampleInputEmail1">Titre</label> <input type="text" class="form-control" name='titre' placeholder="Saisir titre"> </div> <div class="form-group m-b-20"> <label for="videourl">Video URL</label> <input type="text" name="video_link" class="form-control" id="videourl" placeholder="Saisir url.."> </div> <div class="form-group m-b-20"> <input type="file" name="files[]" multiple="multiple" > </div> <div class="form-group m-b-20"> <label>Description</label> <textarea class="summernote" name="description"></textarea> </div> <button type="submit" class="btn btn-success waves-effect waves-light">Enregistrer et publier</button> <button type="button" class="btn btn-danger waves-effect waves-light" >Annuler</button> {!! Form::close() !!} </div> </div> <!-- end p-20 --> </div> <!-- end col --> </div>
kndeye, il y a 9 ans

Lis bien l'erreur, ça te dit Array to string conversion, regarde tes tableaux et essais de debuguer.

Youssef Boudaya, il y a 9 ans

L'upload marche parfaitement maitenant multiple et tout type de fichiers voici le code du controlleur

public function store(Request $request) { $article = New Article(); $article->user_id = $request->get('user_id'); $article->title = $request->get('title'); $article->description = $request->get('description'); $article->save(); /*$file = array('image' => Input::file('image'));*/ foreach(Input::file('image') as $file){ $destinationPath = 'uploads/articles'; // upload path //$extension = Input::file('image')->getClientOriginalExtension(); // getting image extension $title = $file->getClientOriginalName(); // $fileName = $title.'.'.$extension; // renameing image $extension = $file->getClientOriginalExtension(); $file->move($destinationPath, $title); // uploading file to given path $fichier = New Articlefile(); $fichier->article_id = $article->id; $fichier->title = $title; $fichier->path = $destinationPath.'/'.$title; $fichier->save(); } return redirect('articles'); }

et la vue :

<input type="file" name="image[]" multiple id="file-4" >

Merci pour votre aide les gars :D

kndeye, il y a 9 ans

OK, mets ça en résolu.