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

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

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

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

PHP

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

Q&A

解決済

3回答

989閲覧

投稿画面から、画像ファイルをアップロードしたい。

kerokeroryu2631

総合スコア14

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/11/25 14:07

編集2020/11/25 19:05

投稿画面から画像ファイルをアップロードしたいです。
サイトを参考に、画像ファイルアップロードのプログラムを書いたのですが、
下記、エラーメッセージが出てきて、解決方法が分かりません。
画像のアップロードができるようにエラーの解決方法をご教示願えませんでしょうか?

エラーメッセージ:Call to a member function storeAs() on string
C:\xampp\htdocs\jinminshinbun\app\Http\Controllers\ArticleController.php:78

コントローラーの下記の箇所(ArticleController.php:78)でエラーが発生しています。
$article->image_url = $request->image_url->storeAs('public/post_images', $time . '_' . $request->user() . '.jpg');

コントローラー

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Article; use App\Http\Requests\ArticleRequest; use Illuminate\Support\Facades\Auth; class ArticleController extends Controller { // // public function index() { 略... } public function create() { 略... } public function store(ArticleRequest $request, Article $article) { $article->title = $request->title; $article->body = $request->body; $article->user_id = $request->user()->id; //画像をアップロード // $time = date("Ymdhis"); // $article->image_url = $request->image_url->storeAs('public/post_images', $time . '_' . $request->user() . '.jpg'); // $article->image_url = $request->image_url->Storage::putFile('image_url', $request->file('image_url')); $article->image_url = $request->image_url->storeAs('public/post_images', $time . '_' . $request->user() . '.jpg'); dd($article); $article->save(); return redirect()->route('articles.index'); } }

ビュー

<!-- タイトル --> <div class="md-form"> <label>タイトル</label> <input type="text" name="title" class="form-control" required value="{{ old('title') }}"> </div> <!-- 本文 --> <div class="form-group"> <label></label> <textarea name="body" required class="form-control" rows="16" placeholder="本文">{{ old('body') }}</textarea> </div> <!-- 画像投稿 --> <div class="file-field medium"> <div class="btn btn-outline-default waves-effect float-left"> <span>Choose files<i class="fas fa-cloud-upload-alt ml-3" aria-hidden="true"></i></span> <input type="file" name="image_url" value="{{ old('image_url') }}" multiple> </div> </div>

追記:formの部分

@section('content') <div class="container"> <div class="row"> <div class="col-12"> <div class="card mt-3"> <div class="card-body pt-0"> @include('error_card_list') <div class="card-text"> <form method="POST" action="{{ route('articles.store') }}"> @include('articles.form') <button type="submit" class="btn btn-default btn-block">投稿</button> </form> </div> </div> </div> </div> </div> </div> @endsection

追記:dd($request);の結果

+request: Symfony\Component\HttpFoundation\ParameterBag {#1353 ▼ #parameters: array:4 [▼ "_token" => "7Ah0JObQ5QhecxGgq7ntwnOMECp7xYUgCWjLsaQv" "title" => "dadad" "body" => "dada" "image_url" => "IMG_2693.JPG" ] }

解決のために閲覧したサイト:

下記サイトのファイルアップロードの欄の、ファイル名の指定のところに書いてある、下記の記述をコピペして、avatarの部分や変数を変更してみましたが、うまくいきませんでした。

$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id );

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

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

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

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

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

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

gpsoft

2020/11/25 14:24

ビューの、<form>要素の内容も載せてくださいませ。 <form action=... method=... enctype="multipart/form-data"> みたいな感じで、enctype属性を指定してますか?
kerokeroryu2631

2020/11/25 14:36

質問の追記、修正が出来ました。
Y.H.

2020/11/25 14:38

dd($request) の結果を質問に追加できますか?
kerokeroryu2631

2020/11/25 14:45

dd($request);の結果を追記しました。
guest

回答3

0

ベストアンサー

ビューの、form要素のenctype属性にmultipart/form-dataを指定してみてください。

<form method="POST" action="{{ route('articles.store') }}" enctype="multipart/form-data">

追記

調べていただいた内容を見ると、なぜか、multipart/form-dataになってないような気がします。
multipart/form-dataの場合、リクエストのボディ部をFirefoxの開発者ツールで見ると、下図のようになります。赤枠のところを見ると、いかにもバイナリデータが送られてる感じがしますよね。

イメージ説明

Chromeでも同じように見えるはずなのですが、訳あって、ファイルを添付せずにsubmitしたときのスクショしかありません。自分で試すときは、矢印の辺りに**"view source"というボタン**があるので押してください。

イメージ説明

投稿2020/11/25 14:56

編集2020/11/25 16:35
gpsoft

総合スコア1323

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

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

kerokeroryu2631

2020/11/25 15:13

ご指摘ありがとうございます。 「enctype="multipart/form-data」を追加してみたのですが、同じエラーが発生しています。 コントローラーに下記のようにfile()を追加してみても同じエラーが発生しています。 $article->image_url = $request->file('image_url')->storeAs('public/post_images', $time . '_' . $request->user() . '.jpg');
kerokeroryu2631

2020/11/25 15:17

file('image_url')にNULLが入ってしまいます。
gpsoft

2020/11/25 15:29

あれ? そうですか。勘違いしたかな…。 「enctype="multipart/form-data」じゃなくて 「enctype="multipart/form-data"」ですけど、大丈夫ですか? あと、ブラウザの開発者ツールを使って、アップロード時のリクエスト内容を確認してみてほしいのですが、やり方、分かりますか?
kerokeroryu2631

2020/11/25 15:35

<form method="POST" action="{{ route('articles.store') }}" enctype=”multipart/form-data”> すみません、記載ミスです。上のようにダブルクォーテーションで囲ってます。
kerokeroryu2631

2020/11/25 15:37

ブラウザの開発者ツールですか?laravelのデバッグバーなら入れているのですが、 開発者ツールでリクエスト内容を見る方法は分かりません。
kerokeroryu2631

2020/11/25 15:55

クロームの開発者ツールで確認しました。 以下がその結果です。 _token: 7Ah0JObQ5QhecxGgq7ntwnOMECp7xYUgCWjLsaQv title: だだだ body: だだだ image_url: IMG_2693.JPG
gpsoft

2020/11/25 16:14

え〜っとですね。Chromeをお使いのようなので、私も試してみてるんですが、どうも、私のChromeの開発者ツールでは、ファイルをアップロードしたときのFrom Dataが見れないみたいなんです。なので、「こんな風になるはず」というスクショをお見せできず、恐縮です。 ただ、上に書いていただいた内容を見ると、image_url: IMG_2693.JPGとなっているので、やっぱり、multipart/form-dataになってないと思います。multipart/form-dataなら、そこには、image_url: (binary)などと出るはずです。
gpsoft

2020/11/25 16:42

あとは、Chromeの開発者ツールのElementsタブで、<form>タグの内容を再確認してみることをオススメします。スペルミスとか無いですかね。
kerokeroryu2631

2020/11/25 16:56

「enctype="multipart/form-data"」 のダブルクォートが全角でした(T_T) それで、「enctype="multipart/form-data"」になってなかったのだと思います。 お手数おかけしました。 array:4 [▼ "_token" => "7Ah0JObQ5QhecxGgq7ntwnOMECp7xYUgCWjLsaQv" "title" => "だだだ" "body" => "だだだ" "image_url" => Illuminate\Http\UploadedFile {#1341 ▼ -test: false -originalName: "IMG_2693.JPG" -mimeType: "image/jpeg" -error: 0 #hashName: null path: "C:\xampp\tmp" filename: "php2E19.tmp" basename: "php2E19.tmp" pathname: "C:\xampp\tmp\php2E19.tmp" extension: "tmp" realPath: "C:\xampp\tmp\php2E19.tmp" aTime: 2020-11-26 01:53:10 mTime: 2020-11-26 01:53:10 cTime: 2020-11-26 01:53:10 inode: 0 size: 1652240 perms: 0100666 owner: 0 group: 0 type: "file" writable: true readable: true executable: false file: true dir: false link: false linkTarget: "C:\xampp\tmp\php2E19.tmp" }
kerokeroryu2631

2020/11/25 17:07 編集

動いたのですが、指定のフォルダに画像データが入らないので、その原因を探求中です。 こんな感じで直しています。 $article->image_url = $request->file('image_url')->storeAs('public/post_images', $time . '_' . Auth::user()->id . '.jpg');
kerokeroryu2631

2020/11/25 17:21

指定のフォルダがなかったというオチでした。 凡ミスばかりで、すみません。 本当に助かりました。長々と付き合っていただき、ありがとうございました。
gpsoft

2020/11/25 23:21

やったね! がんばってください。
guest

0

+request: Symfony\Component\HttpFoundation\ParameterBag {#1353 ▼
#parameters: array:4 [▼
"_token" => "7Ah0JObQ5QhecxGgq7ntwnOMECp7xYUgCWjLsaQv"
"title" => "dadad"
"body" => "dada"
"image_url" => "IMG_2693.JPG"
]
}

ファイル名しか受けてないですね。

こんな感じになってるはずです。
https://reffect.co.jp/laravel/how_to_upload_file_in_laravel#i-2


...略... $request->image_url->storeAs(...略...)

file()を何故使わないのでしょうか?

解決のために閲覧したサイト:
https://readouble.com/laravel/5.8/ja/filesystem.html

には以下のように記載されてます。

https://readouble.com/laravel/5.8/ja/filesystem.html#file-uploads

$path = $request->file('avatar')->storeAs(
'avatars', $request->user()->id
);

投稿2020/11/25 14:23

編集2020/11/25 14:54
Y.H.

総合スコア7918

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

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

kerokeroryu2631

2020/11/25 14:31

file()を使うと、ddをした時に、nullが入ってしまったので、file()を外しました。
Y.H.

2020/11/25 14:55

gpsoftさんの指摘が当たりっぽい気がします。
kerokeroryu2631

2020/11/25 15:02

<form method="POST" action="/upload" enctype="multipart/form-data"> formにenctypeを追加するということでしょうか? 試してみたのですが、同じエラーメッセージが出ます。ddの内容も以前と何が変化したのか分かりませんでした。
kerokeroryu2631

2020/11/25 15:04

回答を見落としてました。試してみます。
Y.H.

2020/11/25 15:06

追加して、dd($request)の結果を見てください。 変わってませんか? "image_url" => UploadedFile ... があれば、file()を使用すればOKなはず。
kerokeroryu2631

2020/11/25 15:08

#parameters: array:4 [▼ "_token" => "7Ah0JObQ5QhecxGgq7ntwnOMECp7xYUgCWjLsaQv" "title" => "だだだ" "body" => "だだだ" "image_url" => "IMG_2693.JPG" ] 試しましたが、ddの結果が同じで、エラーメッセージの内容も同じです。
kerokeroryu2631

2020/11/25 15:09

file()を使用していないので、試してみます。
kerokeroryu2631

2020/11/25 15:11

$article->image_url = $request->file('image_url')->storeAs('public/post_images', $time . '_' . $request->user() . '.jpg'); 上記のように修正したのですが、同じエラーです。
Y.H.

2020/11/25 15:19 編集

dd($request->all()); ではどういう結果になりますか? 結果に UploadedFile オブジェクトが無ければ すみませんがちょっと私ではわからないです。
kerokeroryu2631

2020/11/25 15:19

dd($request->all());では下記の内容が出ました。 array:4 [▼ "_token" => "7Ah0JObQ5QhecxGgq7ntwnOMECp7xYUgCWjLsaQv" "title" => "だだだ" "body" => "だだだ" "image_url" => "IMG_2693.JPG" ]
kerokeroryu2631

2020/11/25 15:22

UploadedFile オブジェクトはないですね。 enctype=”multipart/form-data”を追加したのに、なぜ渡ってこないのか。難しいです。
Y.H.

2020/11/25 15:26

念のため、ブラウザのキャッシュクリアしてから試してみてください
kerokeroryu2631

2020/11/25 15:33

使用していない他のブラウザで試してみましたが、同様の結果でした。
Y.H.

2020/11/25 15:34

あぁ駄目でしたか。お力になれず。。。 どなたか別の方の回答をお待ちください。
kerokeroryu2631

2020/11/25 16:06

ご親切にありがとうございました。引き続き、調査します。
kerokeroryu2631

2020/11/25 17:21

解決できました。ありがとうございました。
guest

0

削除しました。削除しました。

投稿2020/11/25 17:10

編集2020/11/25 17:12
kerokeroryu2631

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問