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

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

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

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Laravel

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

PHP

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

1回答

1238閲覧

HerokuにデプロイしたLaravelでAWS S3に画像をデプロイできない

helloo

総合スコア11

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Laravel

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

PHP

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2020/04/11 07:21

編集2020/04/13 15:31

前提・実現したいこと

Laravelで作ったアプリをHerokuにデプロイしました。そこでAWS S3を使って画像をアップロードするためにプログラムを書き換えました。
S3を使って画像をアップロードするためにアプリのコントローラのソースコードを書き換えました。
S3側の設定は完了しています。

実現したいこと:herokuにデプロイしたLaravelアプリでAWS S3を使って画像をアップロードできるようにしたいです。

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

アプリで画像を投稿すると以下のスクショのようなエラー画面が表示されます。

Call to a member function hashName() on array

イメージ説明

該当のソースコード

以下、S3を使うためにコードを書き換えたファイルです。

こちらのコントローラーではstoreアクションの上から5行目の$path=~の部分とuploadアクションの上から10行目の$path=~の箇所を以下のように書き換えました。

storeアクション

修正前:sprintf('public/images/%s', $dir); 修正後:Storage::disk('s3')->putFile('/',$form['images'],'public');

uploadアクション

修正前:$request->file->store('public'); 修正後:Storage::disk('s3')->putFile('/',$form['image'],'public');

app/Http/Controllers/StoriesController

PHP

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Http\Controllers\Controller; 7use App\Story; 8use App\Profile; 9use Auth; 10use App\Posts; 11use App\History; 12use App\Attachment; 13use Carbon\Carbon; 14use Storage; 15 16class StoriesController extends Controller 17{ 18 19 public function __construct() 20 { 21 $this->middleware('auth'); 22 } 23 24 public function index(Request $request) 25 { 26 $images = Attachment::all(); 27 $cond_title = $request->cond_title; 28 if ($cond_title != '') { 29 $posts = Profile::where('title', $cond_title)->get(); 30 } else { 31 $posts = Profile::all(); 32 } 33 return view('stories.index2', compact('images','posts','cond_title')); 34 } 35 36 public function add() 37 { 38 return view('stories.create2'); 39 } 40 41 public function store(Request $request) 42 { 43 $form = $request->file('images[]'); 44 $d = new \DateTime(); 45 $d->setTimeZone(new \DateTimeZone('Asia/Tokyo')); 46 $dir = $d->format('Y/m'); 47 $path = Storage::disk('s3')->putFile('/',$form,'public'); 48 $data = $request->except('_token'); 49 50 foreach ($data['images[]'] as $k => $v) { 51 $filename = ''; 52 53 $attachments = Attachment::take(1)->orderBy('id', 'desc')->get(); 54 55 foreach ($attachments as $attachment) { 56 $filename = $attachment->id + 1 . '_' . $v->getClientOriginalName(); 57 } 58 unset($attachment); 59 60 if ($filename == false) { 61 $filename = 1 . '_' . $v->getClientOriginalName(); 62 } 63 $v->storeAs($path, $filename); 64 $attachment_data = [ 65 'path' => Storage::disk('s3'), 66 'name' => $filename 67 ]; 68 $a = new Attachment(); 69 $a->fill($attachment_data)->save(); 70 } 71 unset($k, $v); 72 return redirect('/'); 73 } 74 75public function delete(Request $request) 76 { 77 $images = Attachment::find($request->id); 78 $images->delete(); 79 return redirect('/'); 80 } 81 82 public function upload(Request $request) 83 { 84 $this->validate($request, [ 85 'file' => [ 86 'required', 87 'file', 88 'image', 89 'mimes:jpeg,png', 90 ] 91 ]); 92 93 if ($request->file('images[]')->isValid([])) { 94 $path = Storage::disk('s3')->putFile('/',$form,'public'); 95 return view('stories.index2')->with('filename', basename($path)); 96 } else { 97 return redirect('/') 98 ->back() 99 ->withInput() 100 ->withErrors(); 101 } 102 } 103} 104

こちらのbladeファイルではcontainer1クラスの<img src=~の部分を以下のように修正しました。

修正前: <img src="/storage/{{ $image->path . $image->name }}" class="images" style="height: 250px; width: 250px; border-radius: 50%;"> 修正後:<img src="{{ $image->path }}" class="images" style="height: 250px; width: 250px; border-radius: 50%;">

resources/views/stories/index2.blade.php

@extends('layouts.front2') @section('title','mainpage') @section('content') <link rel="stylesheet" href="{{ asset('css/main2.css') }}"> <div class="profile"> <div class="name"> @guest <a class="nav-link2" href="{{ route('register')}}">{{ __('Create Accout!')}}</a> @else <a id="navbarDropdown" class="nav-link2" href="#" role="button"> {{ Auth::user()->name }}<span class="caret"></span></a> <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> @csrf </form> @endguest </div> <div class="aboutme"> <tbody> @foreach($posts as $profile) <tr> <td>{{ \Str::limit($profile->title, 100) }}</td> <td>{{ \Str::limit($profile->body, 250) }}</td> </tr> <a href="{{ action('ProfileController@delete', ['id' => $profile->id]) }}">delete</a> <a href="{{ action('ProfileController@update', ['id' => $profile->id]) }}" class="update">update</a> @endforeach </tbody> <br> </div> </div> <div class="new"> <div class="newtitle"> <h1>New</h1> </div> <div class="container1"> @foreach ($images as $image) <img src="{{ $image->path }}" class="images" style="height: 250px; width: 250px; border-radius: 50%;"> <a href="{{ action('StoriesController@delete', ['id' => $image->id]) }}">delete</a> @endforeach <div class="more"> more... </div> </div> </div> {{ csrf_field() }} @endsection

resources/views/stories/create2.blade.php

@extends('layouts.front2') @section('title','StoryCreate') @section('content') <link href="{{ asset('/css/main22.css' )}}" rel="stylesheet"> <div class="poststory"> <h1>Post Story</h1> </div> @if ($errors->any()) <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> @endif <form action="{{ url('/') }}" method="POST" enctype="multipart/form-data"> <div class="form"> <label for="photo" class="file">Choose Image or Video</label> <div class="post"> <input type="file" class="here" name="images[]"> </div> </div> <br> </div> {{ csrf_field() }} <div class="post"> <div class="btn postbtn"> <input type="submit" value="post" /> </div> </div> </form> @endsection

routes/web.php

<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('login'); Route::group(['middleware' => 'auth'], function(){ Route::get('/', 'StoriesController@index'); Route::post('/', 'StoriesController@store'); }); Route::group(['middleware' => 'auth'], function(){ Route::get('stories/create', 'StoriesController@add'); Route::post('stories/create', 'StoriesController@upload'); Route::get('/stories/delete', 'StoriesController@delete'); }); Route::get('/profile/delete', 'ProfileController@delete'); Route::group(['middleware' => 'auth','name'=>'profile'], function () { Route::get('/profile/edit', 'ProfileController@edit'); Route::post('/profile/edit', 'ProfileController@update'); Route::post('/profile/create', 'ProfileController@create'); Route::get('profile/create3', 'ProfileController@index3'); }); Route::get('/home', 'StoriesController@index')->name('home'); Auth::routes();

初心者でまだ不慣れな部分がありますが、どうかご教授いただけると幸いです。
よろしくお願いします。

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

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

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

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

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

Lulucom

2020/04/12 00:58

storeアクションやuploadアクションのルートへリクエストするフォームもそれぞれ掲載できますか?
helloo

2020/04/12 06:27

ありがとうございます。 一番最後に追加に掲載しました。写真を投稿するページのファイルです。 よろしくお願いします。
Lulucom

2020/04/12 06:41

ありがとうございます、追記されたのはstoreアクションへリクエストするフォームでしょうか? もう一方のuploadアクションへリクエストするフォームも掲載されると良いかと思います。
helloo

2020/04/12 07:22

ご返信ありがとうございます。 storeアクションとuploadアクションを実行するページが先ほど掲載したファイルになっておりまして、これらのアクションに関するフォームはそちらしか存在しない形になっております…。 よろしくお願いします。
Lulucom

2020/04/12 07:37

ルーティングも掲載されると良いかと思います。
helloo

2020/04/12 07:46

掲載致しました。 お手数かけて申し訳ありません。 よろしくお願いします。
Lulucom

2020/04/13 00:45 編集

ルーティングについて色々と誤解されている気がするので一度見直すと良いでしょう。例えば Route::match(['get','post','middleweare'=>'auth'], '/', 'StoriesController@index', 'StoriesController@store', 'ProfileController@index', 'ProfileController@store' ); ですが、最初の 'StoriesController@index' しか採用されないはずです。HTTPメソッドとURIのパスの組合せに対応するアクションは1つだけです。`php artisan route:list` コマンドで確認できます。 また、いくつかのルートは重複している気がします。
helloo

2020/04/13 06:20

ご丁寧にありがとうございます。 見直して、matchメソッドを一切使わず`web.php`を書き直したものを掲載致しました。 よろしくお願いします。
meshi_s

2020/04/13 06:38

すみません。 「前提・実現したいこと」「発生している問題・エラーメッセージ」があってないように見えるのですが。 何が出来ていないのでしょうか。アップロード?画面表示?
helloo

2020/04/13 07:42

ご指摘ありがとうございます。 掲載していた画像を間違えていました。ただいま、正しいものに掲載し直しました。 よろしくお願い致します。
guest

回答1

0

ベストアンサー

putFileの第2引数の設定が間違っていませんか?
以下ページのアップロード部分を見ていただけたらと。

超簡単!LaravelでS3を利用する手順@Controllerの作成

投稿2020/04/13 08:08

meshi_s

総合スコア276

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

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

helloo

2020/04/13 09:17

ご回答ありがとうありがとうございます。 そちらのリンクのページを参考にし、第二位引数を変更したのですが `Call to a member function hashName() on null` と言われてしまいました…。 お手数かけますがよろしくお願いします。
meshi_s

2020/04/13 09:39

``` $form = $request->file('file'); ``` と変更されていますが、「'file'」の部分は、inputのnameなので、値が取得出来ていないかと思います。 $requestの中身を確認されてから設定した方が良いかと。
helloo

2020/04/13 15:31

返信ありがとうございます。 ご指摘していただいた通りに修正しましたが同じエラーメッセージが表示されてしまいます。 inputのnameはname="images[]"となっておりました。 質問文のソースコードは修正したものに更新しております。 よろしくお願い致します。
meshi_s

2020/04/14 01:37

$request->file('images[]')の中身は確認されましたか? 未確認ですが、配列になっているので、うまく処理できていないのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問