web-dev-qa-db-ja.com

Laravel 4-ファイルのアップロード

他の情報の中でもユーザーが画像をアップロードするフォームがあります。データベースへの画像へのパスを保存し、サーバー上の_public/img/_フォルダーに画像を保存します。

フォームは、次を使用して開かれました:{{ Form::open(['route'=>'pizzas.store', 'files'=>true]) }} so POSTファイル。HTMLの検査次のものがあります。

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

コントローラーに対してPOSTを実行し、フォームからすべてのデータを受け取ることができます。ファイルを処理する方法は次のとおりです。

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

ファイルを選択してフォームを送信すると、すべてが機能しているように見えますが、_/img_フォルダーにはファイルが保存されていません。データベースは、ファイルのパスと名前を正しく登録します。

_if { ...}_ blockの直後にdd($uploadSuccess);を実行すると、次の結果が得られます。

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

私は何を間違えていますか?

22
George Rivera

$ destination_pathが間違っています。次のように、変数$ destinationに/ publicディレクトリへのパスを含める必要があります。

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

33
Reflic

PHP 5.4を使用しているように見えるので、 ステープラー の使用を検討することもできます。現在は非常に安定しており(ベータ版は間もなくリリースされます)、今すぐ記述しなければならない定型文の多くを節約できます。

3
Travis Bennett

相対パスも記述できます。のように

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

または

$destinationPath= 'public/img/';

1

私は同じ問題を抱えていました。私はコードを除いてすべてを正しくしました

public_path()

フォルダーの先頭に追加していませんでした

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

私もファイル名を変更するためにこれをしました

ファイル拡張子を取得しました

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

そして、それは、ファイル名が変更されました。 Laravelは本当に素晴らしい

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

.
.
.

1
arpit desai