web-dev-qa-db-fra.com

Laravel 4 - Téléchargement de fichier

J'ai un formulaire où entre autres informations, un utilisateur téléchargerait une image. Je souhaite stocker le chemin d'accès à l'image dans la base de données et enregistrer l'image dans le dossier public/img/ Sur le serveur.

Le formulaire a été ouvert en utilisant: {{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }} pour qu'il puisse POST fichiers. Inspecter le HTML j'ai le suivant:

<form method="POST" action="http://mypizza/pizzas" 
  accept-charset="UTF-8" enctype="multipart/form-data">

Je peux POST à mon contrôleur et recevoir toutes les données du formulaire comme prévu. La méthode de gestion du fichier est la suivante:

public function store() {
    //TODO -  Validation

    $destinationPath = '';
    $filename        = '';

    if (Input::hasFile('image')) {
        $file            = Input::file('image');
        $destinationPath = '/img/';
        $filename        = str_random(6) . '_' . $file->getClientOriginalName();
        $uploadSuccess   = $file->move($destinationPath, $filename);
    }


    $pizza = Pizza::create(['name'       => Input::get('name'),
                           'price'       => Input::get('price'),
                           'ingredients' => Input::get('ingredients'),
                           'active'      => Input::get('active'),
                           'path'        => $destinationPath . $filename]);

    if ($pizza) {
        return Redirect::route('pizzas.show', $pizza->id);
    }

    //TODO - else
}

Lorsque je sélectionne un fichier et soumets le formulaire, tout semble fonctionner, sauf qu'aucun fichier n'est enregistré dans le dossier /img. La base de données enregistre correctement le chemin d'accès et le nom du fichier.

En exécutant dd($uploadSuccess); juste après le bloc if { ...}, J'obtiens ce qui suit:

object(Symfony\Component\HttpFoundation\File\File)#220 (2) {
  ["pathName":"SplFileInfo":private]=> string(17) "/img\YZmLw7_2.jpg"
  ["fileName":"SplFileInfo":private]=> string(12) "YZmLw7_2.jpg" }

Qu'est-ce que je fais mal?

22
George Rivera

Votre $ destination_path est faux. Vous devez inclure le chemin du répertoire/public dans votre variable $ destination comme ceci:

$destinationPath = public_path().'/img/';

33
Reflic

Comme vous semblez utiliser php 5.4, vous pouvez également envisager d'utiliser Stapler . Il est assez stable maintenant (sortira très bientôt de la version bêta) et vous épargnerait une grande partie du passe-partout que vous devez écrire en ce moment.

3
Travis Bennett

vous pouvez également écrire un chemin relatif. comme en

$destinationPath="resources/assets/images/";

ou

$destinationPath= 'public/img/';

1

j'ai eu le même problème. J'ai tout bien compris à propos de mon code sauf le

public_path()

N'a pas été ajouté au dossier my

$destinationPath= public_path() . '/img/'; // Worked perfect

J'ai aussi fait ça pour changer le nom de mon fichier

J'ai l'extension de fichier

$extension = Input::file('YourFileName')->getClientOriginalExtension();
$filename = WhateverYouWantHere . '.' . $extension;

Et c'est tout, le nom du fichier a changé. Laravel est en effet merveilleux

1
blakroku
$destinationPath= public_path() . 'img/';

la réponse donnée par @Reflic peut donner raison ... mais pas pour moi ....
ce chemin a fonctionné pour moi.
il se peut que j'aie supprimé "public /" de l'url ... merci.

1
arpit desai