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


kndeye
Réponse acceptée

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

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

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');
}

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 ?

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');
    }

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 ?)

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

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.

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

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

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
    }
}

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');
}

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>

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

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

OK, mets ça en résolu.