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

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

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

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

Laravel

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

アップロード

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

Amazon S3

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4049閲覧

LaravelでAWS S3に画像をアップロードできない

helloo

総合スコア11

Heroku

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

Laravel

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

アップロード

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

Amazon S3

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2020/04/14 09:42

編集2020/04/14 14:05

前提・実現したいこと

Laravelで作成したアプリをHerokでデプロイしました。
AWS S3を使って画像をアップロードしたいのですが以下のようなエラーメッセージが表示されててしまいました。

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

Error executing "PutObject" on "https://takamasa.s3.amazonaws.com/lx8HW80N1V0FbV801PnRXctT2MK5G88OqOSKfqKN.png"; AWS HTTP error: Client error: `PUT https://takamasa.s3.amazonaws.com/lx8HW80N1V0FbV801PnRXctT2MK5G88OqOSKfqKN.png` resulted in a `400 Bad Request` response: <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header (truncated...) AuthorizationHeaderMalformed (client): The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2' - <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-east-2'</Message><Region>us-east-2</Region><RequestId>28A0EBC02DEFF677</RequestId><HostId>1iU1JU6i14aQb01ldgyssDyUZltwmOtLbjgFhIQNXUmeETIDmINew6ldwtcHXAxkjyW2yPOr7oM=</HostId></Error>

イメージ説明

該当のソースコード

上から順に、コントローラー、写真を投稿するフォーム、投稿した写真を表示するページのコードとなっております。

app/Http/Controllers/StoriesController.php

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' => $path, 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

resources/views/stories/create2.blade.php

php

1@extends('layouts.front2') 2@section('title','StoryCreate') 3 4@section('content') 5<link href="{{ asset('/css/main22.css' )}}" rel="stylesheet"> 6 7<div class="poststory"> 8 <h1>Post Story</h1> 9</div> 10@if ($errors->any()) 11<ul> 12 @foreach($errors->all() as $error) 13 <li>{{ $error }}</li> 14 @endforeach 15</ul> 16@endif 17<form action="{{ url('/') }}" method="POST" enctype="multipart/form-data"> 18 19 <div class="form"> 20 <label for="photo" class="file">Choose Image or Video</label> 21 <div class="post"> 22 <input type="file" class="here" name="images"> 23 24 </div> 25 </div> 26 <br> 27 </div> 28 29 {{ csrf_field() }} 30 <div class="post"> 31 <div class="btn postbtn"> 32 <input type="submit" value="post" /> 33 </div> 34 </div> 35</form> 36 37@endsection 38

resources/views/stories/index2.blade.php

php

1@extends('layouts.front2') 2@section('title','mainpage') 3 4@section('content') 5 6<link rel="stylesheet" href="{{ asset('css/main2.css') }}"> 7 8<div class="profile"> 9 <div class="name"> 10 @guest 11 <a class="nav-link2" href="{{ route('register')}}">{{ __('Create Accout!')}}</a> 12 @else 13 <a id="navbarDropdown" class="nav-link2" href="#" role="button"> 14 {{ Auth::user()->name }}<span class="caret"></span></a> 15 <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> 16 @csrf 17 </form> 18 @endguest 19 </div> 20 21<div class="aboutme"> 22 <tbody> 23 @foreach($posts as $profile) 24 <tr> 25 <td>{{ \Str::limit($profile->title, 100) }}</td> 26 <td>{{ \Str::limit($profile->body, 250) }}</td> 27 </tr> 28 <a href="{{ action('ProfileController@delete', ['id' => $profile->id]) }}">delete</a> 29 <a href="{{ action('ProfileController@update', ['id' => $profile->id]) }}" class="update">update</a> 30 @endforeach 31</tbody> 32<br> 33</div> 34</div> 35 36<div class="new"> 37 <div class="newtitle"> 38 <h1>New</h1> 39 </div> 40 <div class="container1"> 41 @foreach ($images as $image) 42 <img src="{{ $image->path }}" class="images" style="height: 250px; width: 250px; border-radius: 50%;"> 43 <a href="{{ action('StoriesController@delete', ['id' => $image->id]) }}">delete</a> 44 @endforeach 45 <div class="more"> 46 more... 47 </div> 48 </div> 49</div> 50 51 52{{ csrf_field() }} 53@endsection

試したこと

$ php artisan cache:clear $ php artisan route:clear $ php artisan config:clear

上記のコマンドを試したのですが変化が見られませんでした。
まだ初心者で至らぬところは多々あるかとは思いますが、力をお貸しいただければ幸いです。
よろしくお願い致します。

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

MacOS Catalina 10.15.4
Docker for Mac version 2.2.0.5
PHP 7.3.11
Composer 1.9.1
heroku/7.39.2 darwin-x64 node-v12.13.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

環境変数でS3バケットのリージョン名の指定は正しいでしょうか。

エラーで the region 'us-east-1' is wrong; expecting 'us-east-2' となっているので、us-east-2が正しいのではないかと思いました。

投稿2020/04/14 11:21

Lulucom

総合スコア1899

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

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

helloo

2020/04/14 12:50

回答ありがとうございます。 ご指摘いただいた通り`region`を`us-east-2`に修正したところエラーメッセージは表示されなくなりました。 しかし、いざ画像を投稿を試みると指定したページにリダイレクトするだけで画像が投稿されません。 新しく質問を作成した方がよろしいでしょうか…? お手数かけますが、返信いただけると幸いです。 よろしくお願いします。
Lulucom

2020/04/14 13:05

> 画像が投稿されません Amazon S3 コンソールでそのバケットを確認しても無いということでしょうか。
helloo

2020/04/14 13:10

説明不足で申し訳ありません。 はい、S3のバケット内にはあるのですが、ページに表示されないと言う現象が起こっております。
Lulucom

2020/04/14 13:16

表示に問題があるということなんですね。 Attachmentモデルに対応するテーブルはattachmentsでしょうか?該当のレコードのpathカラムには画像のパスは入っていますか?
helloo

2020/04/14 13:27

はい。 Attachmentモデルに対応しているテーブルはおっしゃる通りattachmentsとなっております。 確認したところ、データベースは何も変化がありませんでした。 画像が投稿されていないことと同じ状況になっています。
Lulucom

2020/04/14 13:48 編集

問題なのはstoreアクションの方でしょうか? (uploadアクションはもし無関係なのでしたら掲載されない方が良いかなと思いました) 次の部分でS3に保存されていると思います。  $path = Storage::disk('s3')->putFile('/',$form,'public'); その$pathを以下の部分でAttachmentのためにセットする必要があるのではないでしょうか。  $attachment_data = [   'path' => $path, // ← ここ   'name' => $filename  ];
helloo

2020/04/14 14:08

ありがとうございます。 ご指摘して頂いたように、uploadアクションの削除、` 'path' => $path ` のように変更いたしましたが、再度画像を投稿するとS3には追加され、データベース側には変化なし。という状況に変わりはありませんでした。 お手数かけますがよろしくお願いします。
Lulucom

2020/04/14 14:14

storeアクションのコードがよくわからないのですが、  foreach ($data['images'] as $k => $v) { のループ内が処理されていないのではないでしょうか。
Lulucom

2020/04/14 15:28 編集

参考サイトは複数ファイルのアップロードの例ですが、今回は1ファイルのみではないでしょうか。1ファイルのみの例を参考にされると良いかと思います。
helloo

2020/04/14 15:42

一応複数のファイルをアップロードが可能なアプリを作成し、画像をローカルに保存していた時はこのコードでも正常に機能していました…。
Lulucom

2020/04/14 15:49

そうですか... 掲載のコードは、1ファイル向けのコードと複数ファイル向けのコードが混在していて、storeアクションはうまく動かない気がしているのですが...
helloo

2020/04/14 16:26

はい…。 まだその見分けもつかないような初学者で申し訳ありません…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問