🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Laravel 5

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

Q&A

解決済

1回答

1251閲覧

laravelで画像アップができずエラー表示される

kentooooo

総合スコア18

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Laravel 5

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

0グッド

0クリップ

投稿2019/11/19 11:07

編集2019/11/19 22:21

色々勉強中の初心者です
よろしくお願いします。

前提・実現したいこと

Larabelにて画像アップ実装中、エラーが起きる
文字化け?のようなアラート表示あります。

発生している問題・エラーメッセージ

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\x89PNG\x0D\x0A...' for column 'img1' at row 1

該当のソースコード

php

1<form class="container" action="" method="post" enctype="multipart/form-data"> 2 <input class="u-wid60 u-ma" type="file" name="img1" id="" accept="image/*"> 3    <button type="submit" class="">作成</button> 4</form> 5<img class="profileImg u-mb20" src="" alt="image" > 6                   //storage/に保存した時、srcの指定も教えていただきたいです。

php

1public function store(Request $request,Photo $photo) 2 { 3 4 $photo = new Photo; 5 $Img1 = $request->file('img1'); 6 $image1 = \Image::make(file_get_contents($Img1->getRealPath())); 7 $image1->resize(300, 300)->save(public_path().'/images/300-300-'.$Img1->hashName()); 8 $photo->img1 = $image1; 9 $photo->save();
database.phpの中身(関係ありそうなところのみ抜粋です) 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ],

試したこと

リンク内容
こちらのページを参考にさせていただきました。
public/imagesフォルダをつくり、その中にリサイズされた画像が保存されているのは確認できています。
が、DBには保存されておりません。送信ボタンを押すと上記のようなエラーメッセージが表示され画面がフリーズします。

補足情報(FW/ツールのバージョンなど)

Laravel5.6使用
文字コードutf8mb4使用しています(絵文字が使いたいので)
その辺り関係がありますでしょうか。

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

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

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

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

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

Orlofsky

2019/11/19 11:12

[MySQL]タグを追加しては?
guest

回答1

0

ベストアンサー

リサイズした画像そのもの(バイナリデータ)をデータベースに保存しようとしていますか?
だとすれば、img1カラムの型が間違っています。

画像のpathだけ保存しようとしているなら、phpのコードが間違っています。

投稿2019/11/19 11:48

KonPota

総合スコア121

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

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

kentooooo

2019/11/19 12:08

バイナリデータをDBに保存する、というのはよくないと何かの記事で読んだ気がしまして、パスを保存したいなと考えておりました。
kentooooo

2019/11/19 12:13 編集

お手透きでしたら、お答えもそうですがどちらの方がいいのかお教え頂ければ幸いです。
KonPota

2019/11/19 12:43

ファイルのpathのみDBに保存するほうがよいと思います。 現状のコードではバイナリデータを保存しようとしています。 以下のようにすればpathが保存できると思います。(若干自信なし) $photo->img1 =public_path().'/images/300-300-'.$Img1->hashName(); 少し話はそれますが、画像はpublic/の中ではなくstorage/に保存して、public/からシンボリックリンクを貼ったほうがいいです。 くわしくはドキュメントを参照くださいませ。 https://readouble.com/laravel/6.x/ja/filesystem.html パブリックディスクの項です。
mikkame

2019/11/19 13:30

横から失礼します。 SQLアンチパターンとしてパスだけ保存するのもファントムファイルとして良くないとされているので 要件や設計に合わせてどちらか選択をすべきかと思います。
kentooooo

2019/11/19 22:26 編集

>public/からシンボリックリンクを貼ったほうがいいです。 コンソールにて php artisan storage:link The [public/storage] directory has been linked. と表示されました public/imagesに保存する設定?のまま、お答えにありました $photo->img1 =public_path().'/images/300-300-'.$Img1->hashName(); ですと、保存することも表示も可能になりました。本当にありがとうございます。 別の問題なのですが storage/に保存する場合、上記コードはどう書き直したら良いのでしょうか? storage_path().'/images/300-300-'.$Img1->hashName() としましたら Can't write image data to path とエラーがでまして。 勧められた通りのstorage/直下に保存するやり方がうまくいきません。そしてあわせてviewで画像が表示されません <img class="" src="{{asset($photo->img1)}}" alt="image" > で動きませんです。
KonPota

2019/11/19 23:30

>The [public/storage] directory has been linked. laravelインストール時に自動でシンボリックリンクが張られていたのかも。 >Can't write image data to path storageの中にimagesディレクトリが無い、もしくは適切なパーミッションではないのかも。 ごめんなさい!保存するパスに関しまして、前回のコメントではpublic_path()も含めたましたが、は、'/images/~~’のほうが扱いやすいと思います。 $photo->img1 = '/images/300-300-'.$Img1->hashName(); storage_path()の中の'/images/'に保存してある前提では、 <img class="" src="{{asset('storage’.$photo->img1)}}" alt="image" >でいけるはずです。
kentooooo

2019/11/20 00:15

storage/imagesを作成し $image1->resize(300, 300)->save(storage_path().'/images/300-300-'.$Img1->hashName()); として $photo->img1 = '/images/300-300-'.$Img1->hashName(); としてDBに保存しました DBの「img1」カラムには /images/300-300-KkCR5qluWScqeqNQN6ALHvIEqH8VsGRMeY8D1lPI.png のような形で保存されています ご指摘の通りにimgタグにsrc属性を追加したところ syntax error, unexpected '?' (View: /home/vagrant/code/resources/views/..... のエラー表示が出ました… storage/imagesのなかに画像はトリミングされて保存されています。 view側の表示の問題だろうと思うのですが…うまくいきません。
KonPota

2019/11/20 00:19

あと少しですね! ごめんなさい。imgタグのassetのシングルクォートがおかしかったです。(誤 ’ 正 ') 正しくは以下です。 <img class="" src="{{asset('storage'.$photo->img1)}}" alt="image" >
kentooooo

2019/11/20 02:11

すいません、300-300は必ずしも必要ではなかったのでsaveの所で $image1->resize(300, 300)->save(storage_path().'/images/'.$Img1->hashName()); としまして、その結果です。 今外出先でして、返信が遅れると思いますのでご了承ください。 申し訳ありません。
kentooooo

2019/11/20 04:01

アクセスすると Sorry, the page you are looking for could not be found. と表示されます。
KonPota

2019/11/20 05:18

こちらのアドバイスも間違いが多く申し訳ない! 以下のようにやってみてください。 //storage/app/public/images/を作成して、書き込み化にしておく。 //サムネイルを保存するコードは以下のように変更 $filename = '/images/'.$Img1->hashName(); $image1->resize(300, 300)->save(storage_path().'/app/public'.$filename); $photo->img1 = $filename; $photo->save(); //画像の表示は以下のタグで <img src="{{asset('storage'.$photo->img1)}}" alt="image">
kentooooo

2019/11/20 05:51

ありがとうございます! 無事保存、表示完了しました!!!! 長らくお世話になりました! 会ってお礼を言いたいですが、それができないのが申し訳ないです! 本当にありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問