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

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

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

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

PHP

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

Q&A

解決済

3回答

2489閲覧

Laravel6.0 画像アップロードを実装したいです。

youth_k0228

総合スコア18

Laravel

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

PHP

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

0グッド

1クリップ

投稿2020/05/27 15:06

編集2020/05/30 15:12

こんばんは。
Laravelを扱う勉強を兼ねて、画像投稿掲示板を作成しているのですが、投稿した画像のファイルパスをDBに格納させる方法が調べてみても上手く実装できず詰まってしまいました。
storage:link ArtisanコマンドでStorageフォルダを作成、その中に画像を保存するところまでは上手くできました。
具体的に行いたいことは下記の通りです。

1.投稿した画像ファイルをstorage/app/imagesフォルダに保存(現状出来上がったのはここまでです。)
2.保存した画像ファイルのファイルパスをDBに格納
3.ファイルパスを参照し、詳細ぺージで画像を表示

環境は以下の通りです。
FW:Laravel6.0
OS:Windows10 Home
DB:MySQL(phpmyadmin)

以下、Pictureクラスのコントローラ、詳細ページのビュー、新規投稿ページのビュー、ルーティング、picturesテーブル定義のソースコードです。

PictureController.php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Picture; 7 8class PictureController extends Controller 9{ 10 /** 11 * Display a listing of the resource. 12 * 13 * @return \Illuminate\Http\Response 14 */ 15 public function index(Request $request) 16 { 17 if($request->filled('keyword')){ 18 $keyword=$request->input('keyword'); 19 $message='「'.$keyword.'」で検索'; 20 $pictures = Picture::where('content','like','%'.$keyword.'%')->get(); 21 //データベースに格納されてあるデータの中で、入力されたキーワードが含まれているものを呼び出す。 22 }else{ 23 $message='This is my picture memo.'; 24 $pictures = Picture::all(); 25 //データベースに格納されてあるデータを全て呼び出す。 26 } 27 return view('index',['message'=>$message,'pictures'=>$pictures]); 28 //html上にここで格納した変数の中身を表示させる為に渡す。 29 } 30 31 /** 32 * Show the form for creating a new resource. 33 * 34 * @return \Illuminate\Http\Response 35 */ 36 public function create(Request $request) 37 { 38 $message='New picture'; 39 return view('new',['message'=>$message]); 40 } 41 42 /** 43 * Store a newly created resource in storage. 44 * 45 * @param \Illuminate\Http\Request $request 46 * @return \Illuminate\Http\Response 47 */ 48 public function store(Request $request) 49 { 50 $picture=new picture(); 51 //投稿した画像とコメントをDBに格納させる 52 $picture->user_name=$request->user_name; 53 $picture->content=$request->content; 54 $picture->image=$request->file('thefile')->storeAs('images', 'image'.$picture->id); //storageフォルダに投稿した画像を保存する 55 $picture->save(); 56 //tinkerコマンドと同じ 57 return redirect()->route('picture.show',['id'=>$picture->id]); 58 } 59 60 /** 61 * Display the specified resource. 62 * 63 * @param \App\picture $picture 64 * @return \Illuminate\Http\Response 65 */ 66 public function show(Request $request,$id,Picture $picture) 67 { 68 $message='This is your picture.'.$id; 69 $picture=Picture::find($id); 70 //$idに格納された番号と一致したデータを引っ張り出す。 71 return view('show',['message'=>$message,'picture'=>$picture]); 72 } 73 74 /** 75 * Show the form for editing the specified resource. 76 * 77 * @param \App\picture $picture 78 * @return \Illuminate\Http\Response 79 */ 80 public function edit(Request $request,$id,picture $picture) 81 { 82 $message='Edit your picture.'.$id; 83 $picture=Picture::find($id); 84 //$idに格納された番号と一致したデータを引っ張り出す。 85 return view('edit',['message'=>$message,'picture'=>$picture]); 86 } 87 88 /** 89 * Update the specified resource in storage. 90 * 91 * @param \Illuminate\Http\Request $request 92 * @param \App\picture $picture 93 * @return \Illuminate\Http\Response 94 */ 95 public function update(Request $request,$id, picture $picture) 96 { 97 $picture=Picture::find($id); 98 //登録したブックマークをDBに格納させる 99 $picture->content=$request->content; 100 $picture->user_name=$request->user_name; 101 $picture->save(); 102 //tinkerコマンドと同じ 103 return redirect()->route('picture.show',['id'=>$picture->id]); 104 } 105 106 /** 107 * Remove the specified resource from storage. 108 * 109 * @param \App\picture $picture 110 * @return \Illuminate\Http\Response 111 */ 112 public function destroy(Request $request,$id,picture $picture) 113 { 114 $picture=Picture::find($id); 115 $picture->delete(); 116 return redirect('/pictures'); 117 } 118}

new.blade.php

1@extends('layout') 2 3@section('content') 4<h1>MYPICTURE</h1> 5<p>{{$message}}</p> 6{{Form::open(['route'=>'picture.store','files'=>true])}} 7<div class="form-group"> 8 <!--投稿した画像のユーザーネームをDBに格納させる--> 9 {{Form::label('user_name','Name:')}} 10 {{Form::text('user_name',null)}} 11</div> 12<div class='form-group'> 13 <!--投稿したコメントをDBに格納するビュー--> 14 {{Form::label('content','Content:')}} 15 {{Form::text('content',null)}} 16</div> 17<div class='form-group'> 18 <!--ファイルを読み込む--> 19 {{Form::file('thefile')}} 20</div> 21<div class="form-group"> 22 {{Form::submit('作成する',['class'=>'btn btn-primary'])}} 23 <a href='{{ route("picture.list")}}'>一覧に戻る</a> 24</div> 25{{Form::close()}} 26@endsection

Web.php

1<?php 2 3/* 4|-------------------------------------------------------------------------- 5| Web Routes 6|-------------------------------------------------------------------------- 7| 8| Here is where you can register web routes for your application. These 9| routes are loaded by the RouteServiceProvider within a group which 10| contains the "web" middleware group. Now create something great! 11| 12*/ 13 14Route::get('/', function () { 15 return redirect('/picture'); 16}); 17Route::get('/pictures','PictureController@index')->name('picture.list'); 18Route::get('/picture/new','PictureController@create')->name('picture.new'); 19Route::post('/picture','PictureController@store')->name('picture.store'); 20Route::get('/picture/edit/{id}','PictureController@edit')->name('picture.edit'); 21Route::post('/picture/update/{id}','PictureController@update')->name('picture.update'); 22Route::get('/picture/{id}', 'PictureController@show')->name('picture.show'); 23Route::delete('/picture/{id}','PictureController@destroy')->name('picture.delete'); 24?>

show.blade.php

1 @extends('layout') 2<!--各ページのビューを司る--> 3@section('content') 4<h1>MYPICTURE</h1> 5<div> 6 <p>{{$message}}</p> 7 <p>{{$picture -> content}}</p> 8 <p>{{$picture -> user_name}}</p> 9 <p> 10 <a href='{{route ("picture.list")}}' class='btn btn-outline-primary'>一覧に戻る</a> 11 <a href='{{route ("picture.edit",["id"=>$picture->id])}}' class='btn btn-outline-primary'>編集</a> 12 13 </p> 14</div> 15<div> 16 {{Form::open(['method' => 'delete','route'=> ['picture.delete',$picture->id]])}} 17 {{Form::submit('削除')}} 18 {{Form::close()}} 19</div> 20@endsection

2020_01_05_062834_create_pictures_table.php

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreatepicturesTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('pictures', function (Blueprint $table) { 17 $table->bigIncrements('id'); 18 $table->string('content'); 19 $table->timestamps(); 20 }); 21 } 22 23 /** 24 * Reverse the migrations. 25 * 26 * @return void 27 */ 28 public function down() 29 { 30 Schema::dropIfExists('pictures'); 31 } 32} 33

2020_01_12_155013_add_column_username.php

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class AddColumnUsername extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::table('pictures', function (Blueprint $table) { 17 $table->string('user_name'); 18 }); 19 } 20 21 /** 22 * Reverse the migrations. 23 * 24 * @return void 25 */ 26 public function down() 27 { 28 Schema::table('picture', function (Blueprint $table) { 29 // 30 }); 31 } 32} 33

2020_05_27_145554_add_column_image.php

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class AddColumnImage extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::table('pictures', function (Blueprint $table) { 17 //投稿した画像のファイルパスを格納 18 $table->string('image'); 19 }); 20 } 21 22 /** 23 * Reverse the migrations. 24 * 25 * @return void 26 */ 27 public function down() 28 { 29 Schema::table('pictures', function (Blueprint $table) { 30 // 31 }); 32 } 33} 34

以下、作成したDBのキャプチャです。
「image」カラム(String型)にファイルパスを格納するつもりです。(スクショ撮影時はnullになっています。)
イメージ説明

20200530追記
Pictureのモデルクラスですが、artisanでファイルを作成したのみで、中身は未設定です。

picture.php

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class picture extends Model 8{ 9 // 10} 11

以上、不勉強で至らぬ所ではございますが、ご教授・ご助言をお願い致します。m(_ _)m

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

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

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

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

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

rururu3

2020/05/27 15:47

ぱっと見出来てていい気がするけど、とりあえず pictureクラスのソースとテーブル定義(picturesテーブル作成のマイグレーションファイルのソース) も載せてほしいです
youth_k0228

2020/05/29 15:43

こんばんは。 レスが遅くなってしまい、大変申し訳ありません。 先程、Pictureクラスと各マイグレーションファイルを追記致しました。 恐れ入りますが、ご査収の程宜しくお願い致します。
rururu3

2020/05/29 15:46

一番欲しい use App\Picture; が無いです…。 (Pictureクラス)
youth_k0228

2020/05/29 16:02

失礼致しました。 Pictureのモデルクラスはartisanでファイルを作成したのみで、中身は未設定です...。
rururu3

2020/05/29 16:27

問題なくimageフィールドに追加されたなぁ…気になったことはDBのデータにおいてcreate_atとかの日付がかなり過去とかなので、データ処理行ってるかとかかなぁ…
rururu3

2020/05/29 16:43 編集

ちょっと確認ですが 1.投稿した画像ファイルをstorage/app/imagesフォルダに保存 2.保存した画像ファイルのファイルパスをDBに格納 3.ファイルパスを参照し、詳細ぺージで画像を表示 これの1しかできてないってことでいいですよね?(imageフィールドには空文字かnullが入っているっていうことですよね?)
youth_k0228

2020/05/30 15:09

レスが遅くなってしまいすみません。 はい。まだ1しか実装できておらず、imageフィールドはnullです。
rururu3

2020/05/30 20:17

$picture->image=$request->file('thefile')->storeAs('images', 'image'.$picture->id); //storageフォルダに投稿した画像を保存する ここの処理で値が入らないってことなので、 laravelのログでエラー出てないかとか $wk=$request->file('thefile')->storeAs('images', 'image'.$picture->id); //storageフォルダに投稿した画像を保存する \Log::info(print_r($wk, true)); $picture->image = $wk; でlaravelのログに値を出してみるとかで調べてみるとかかなぁ…
youth_k0228

2020/06/01 14:22

\Log::infoを入れたところ、下記のログが出力されました。 [2020-06-01 14:02:06] local.INFO: images/image やはり値は入っていませんでした。
youth_k0228

2020/06/01 14:34

すみません。 画像を保存する処理を「storeAs」から「store」に変更したところ、画像のパスがimageカラムに入れることができました! 以下Log [2020-06-01 14:26:14] local.INFO: images/9fGrwB7juwgxt4cpEbOOnsAUvbwcPJktM6SHS0Mo.jpeg
rururu3

2020/06/02 02:49 編集

もしかして、現在の問題は、storeAsの処理だとimages/imageっていう値が入ってるってことだったりします?(だったら理由はわかります
youth_k0228

2020/06/02 10:20

すみません、仰る通りです。 ファイル名を「イメージ+id」にしようと思い、storeAsを使いました。 記述が不十分で大変申し訳ありません。 ご教授の程お願い致します。
rururu3

2020/06/02 10:21

だったら理由は簡単です…
guest

回答3

0

解決したにもかかわらず、放置してしまい大変申し訳ありません。
以下、実装方法をQiitaに投稿致しました。

Laravel掲示板に画像投稿機能を追加してみた!

投稿2020/11/13 02:43

youth_k0228

総合スコア18

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

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

0

ベストアンサー

質問の内容がimages/imageっていう値が入っているっていうことなので回答します

(ファイル名を「イメージ+id」にしようと思い、storeAsを使いました。)

php

1$picture->image=$request->file('thefile')->storeAs('images', 'image'.$picture->id);

$picture->idを使ってますが、$picture->idbigIncrementsなのでsaveなどしてDBに反映されないと設定されないのでnullになるのが原因です

投稿2020/06/02 10:25

rururu3

総合スコア5545

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

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

youth_k0228

2020/06/02 14:33

すみません。 この場合、PictureControllerクラスの冒頭にbigIncrementを使用する記述を加えなければならないということでしょうか。 DBの「id」はbigIncrementで設定されており、「return redirect()」以下では「$picture->id」をそのまま使用しております。
rururu3

2020/06/03 04:05

bigIncrementなのでデータ登録時にIDが決定する感じです。 なのでid取得しようとするならばsave後じゃないといけません
youth_k0228

2020/06/03 15:36

すみません、それは存じ上げていませんでした。 質問を重ねてしまい申し訳ありませんが、「save()」の後に「storeAs」でidを取得することを記述するということでしょうか。
rururu3

2020/06/04 02:18

ファイル名にidをどうしても利用したい場合はそうなります。 ファイルが保存できなかったときゴミデータが出る可能性があるのでトランザクション必要かもしれません。 &画像名が推測しやすくなりますので推測されたくなければ注意が必要です
youth_k0228

2020/06/09 13:40

間が開いてしまい申し訳ありません。 ファイル名にidを使用すると、そのようなリスクが表れるのですね...。 だとするとidは使わず、ランダムでファイル名付ける方向で実装したいと思います。 ありがとうございます。
guest

0

fillableの対象になってなかったりguardedの対象になってる可能性は?

投稿2020/05/27 23:31

hentaiman

総合スコア6389

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

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

youth_k0228

2020/05/29 15:51

こんばんは。 レスが遅くなってしまい、大変申し訳ありません。 モデルクラスは初期設定のままでしたので、fillableの対象を設定していませんでした...。 確認し、こちらを実装してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問