質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

1174閲覧

Laravel5.4で画像をアップロードし、public/imagesに保存したい

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2017/08/27 06:24

現在Laravel5.4でグルメサイトの作成をしています。

formでレストラン名や住所などと一緒に、画像を登録した際に、画像がpublic/imagesフォルダに保存されるように実装したいのですが、できません。

いかに、create.blade.php, form.blade.php, ShopsController.phpのコードを掲載しております。どこが間違っているのかわかる方がおりましたら教えていただきたいですm(_ _)m
また根本的にLaravel5.4での画像アップロードの手法と間違っている場合は、その点も指摘していただけましたら幸いです。

create.blade.php

php

1@extends('layout') 2 3@section('content') 4 5<div class="page-size center-block"> 6 <h3>レストラン新規登録</h3> 7 <hr/> 8 @include('errors.form_errors') 9 10 {{Form::open(array('url' => 'shops', 'files' => true))}} 11 @include('shops.form') 12 {{Form::close()}} 13</div> 14@stop

form.blade.php

php

1 <div class="form-group"> 2 {{Form::label('fname', 'レストランの写真')}} 3 {{ Form::file('fname') }} 4 </div> 5 <div class="form-group"> 6 {{Form::label('name', '店名')}} 7 {{Form::text('name', null, ['class' => 'form-control'])}} 8 </div> 9 <div class="form-group"> 10 {{Form::label('category', 'カテゴリー')}}<br> 11 {{Form::select('category', [ 12 'フィリピン料理' => 'フィリピン料理', 13 '和食' => '和食', 14 '魚介・海鮮料理' => '魚介・海鮮料理', 15 'そば・うどん' => 'そば・うどん', 16 '焼き鳥' => '焼き鳥', 17 'お好み焼き' => 'お好み焼き', 18 'しゃぶしゃぶ' => 'しゃぶしゃぶ', 19 '洋食' => '洋食', 20 'フレンチ' => 'フレンチ', 21 'イタリアン' => 'イタリアン', 22 'スペイン料理' => 'スペイン料理', 23 'ステーキ' => 'ステーキ', 24 'ハンバーガー' => 'ハンバーガー', 25 '中華料理' => '中華料理', 26 '餃子' => '餃子', 27 '韓国料理' => '韓国料理', 28 'タイ料理' => 'タイ料理', 29 'ラーメン' => 'ラーメン', 30 'カレー' => 'カレー', 31 '焼肉' => '焼肉', 32 '鍋' => '鍋', 33 '居酒屋' => '居酒屋', 34 'バイキング' => 'バイキング', 35 'カフェ' => 'カフェ', 36 'パン' => 'パン', 37 'スイーツ' => 'スイーツ', 38 'バー・お酒' => 'バー・お酒'] 39 )}} 40 </div> 41 <div class="form-group"> 42 {{Form::label('description', 'レストランの紹介')}} 43 {{Form::textarea('description', null, ['class' => 'form-control'])}} 44 </div> 45 <div class="form-group"> 46 {{Form::label('address', '住所')}} 47 {{Form::text('address', null, ['class' => 'form-control'])}} 48 </div> 49 <div class="form-group"> 50 {{Form::label('runningtime', '営業時間')}} 51 {{Form::text('runningtime', null, ['class' => 'form-control'])}} 52 </div> 53 <div class="form-group"> 54 <!-- {{Form::label('published_at', 'Publish On:')}} --> 55 {{Form::hidden('published_at', date('Y-m-d'))}} 56 </div> 57 <div class="form-group form-button center-block"> 58 {{Form::submit('登録', ['class' => 'btn btn-success form-control'])}} 59 </div>

ShopsController.php

php

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Shop; 6use Illuminate\Http\Request; 7 8class ShopsController extends Controller { 9 10 public function index() { 11 $shops = Shop::latest('published_at')->get(); 12 return view('shops.index', compact('shops')); 13 } 14 15 public function show($id) { 16 $shop = Shop::findOrFail($id); 17 return view('shops.show', compact('shop')); 18 } 19 20 public function create() { 21 return view('shops.create'); 22 } 23 24 public function store(Request $request) { 25 $path = $request->file('fname')->store('images'); 26 27 // ①フォームの入力値を取得 28 $inputs = \Request::all(); 29 30 // ②マスアサインメントを使って、記事をDBに作成 31 Shop::create($inputs); 32 33 // ③レストラン一覧へリダイレクト 34 return redirect('shops'); 35 } 36}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2017/08/27 07:38

どのような問題が生じているのか具体的に書いてください。ログにメッセージが出ているようであれば、メッセージも記載してください。
退会済みユーザー

退会済みユーザー

2017/08/27 07:41

失礼しました。直ちに修正いたしますので、今しばらくお待ちいただけますと幸いです。
guest

回答2

0

ベストアンサー

あくまでもpublic/images配下にファイルを保存するようにしたいのであれば、
config/filesystems.phpのdisks設定にpublicディレクトリ、もしくはpublic/imagesに向く設定を追加し、その名前をstoreメソッドの第二引数に指定する必要があります。
(もしくはシステム全体のデフォルトをその設定にしてもよい、filesystems.phpの冒頭参照)

デフォルトの設定ではlocalが使われることになりますが、
このlocalでのパスはstorage/app配下が指定されているため
->store('public/images');と書いても、storage/app/public/imagesの下にファイルが出来るだけです。

// filesystems.php // disks設定に追加(publicはデフォルトで存在するので、本当なら別名推奨) 'public' => [ 'driver' => 'local', 'root' => public_path(); ] // ShopsControllerのstoreメソッド // storeの第二引数に、上の設定名を指定 $uploadName = $request->file('fname')->store('images', 'public'); // ファイル名を指定したければ、storeAsの第三引数に設定名を指定 $uploadName = $request->file('fname')->storeAs('images', 'somethingName.jpg', 'public'); // 共に$uploadNameにはアップしたパスとファイル名情報が含まれています

ここまで書きましたが、Laravelの推奨はpublic/images直下には直接ファイルを置くのではなく、
一度アップロードファイルは'storage/app/public'以下に置き、
public/storageからstorage/app/publicにシンボリックリンクを張り
アクセスすることを推奨しています。
これでよいのであれば、以下のページの「パブリックディスク」の項目が参考になります。

https://readouble.com/laravel/5.4/ja/filesystem.html

あわせて以下のページ最後の「アップロードファイルの保存」の項目も見ると使い方がわかります。
https://readouble.com/laravel/5.4/ja/requests.html

もともと最初から存在するpublic設定を使ってstoreメソッドを使い、
php aritsan storage:linkでシンボリックリンクを張るだけです。


最後になりますが、HTMLのformにenctype="multipart/form-data"を忘れないようにしてください。

投稿2017/08/27 13:16

Archsted

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/29 09:51

非常にご丁寧な回答をいただき感謝いたします。おかげさまで保存のフローを理解することができました。ありがとうございます。
guest

0

できないだけじゃわからないので、とりあえず、

画像がpublic/imagesフォルダに保存

なら

$request->file->store('public/images');

じゃないかなぁ

投稿2017/08/27 07:45

編集2017/08/27 07:47
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/27 07:55

ご回答いただきありがとうございます。$request->file->store('public/images');で試してみたところ、以下のエラーが出ました。 Call to a member function store() on null
CHERRY

2017/08/27 11:55

すいません。 $request->file('fname')->store('public/images'); ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問