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

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

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

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

Amazon S3

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

Laravel 5

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

Q&A

解決済

2回答

7116閲覧

Laravel5.8で画像urlから画像を取得してS3に保存する方法

qiitenai

総合スコア12

PHP

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

Amazon S3

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

Laravel 5

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

1グッド

1クリップ

投稿2019/04/27 03:32

編集2019/04/27 03:33

前提・実現したいこと

Laravel5.8において、入力フォームに画像のURLを入力しpostし、そのurlから画像データを取得してS3に保存したいです。

入力フォームで画像ファイルを選択して、それをController側でS3に保存することにはすでに成功しています。
今回は、画像ファイルではなくて画像URLを入力することでController側からS3に保存することを実現したいです。
また、前提としてフォームに入力する画像URLはpublic公開されているものです。

該当のソースコード

まずは成功している「画像ファイル」経由のアップロードのソースコードを添付します。

// upload_file.blade.php <h3>画像ファイルをアップロード</h3> <form method="post" enctype="multipart/form-data"> {{ csrf_field() }} <input type="file" name="file"> <button type="submit">保存</button> </form>
// ThumbnailController.php // ファイルのインスタンスを取得する $file = $request->file('file'); //現在のUnixタイムスタンプを利用してファイル名をつける $file_name = time(); //ファイルのリサイズを行う Image::make($file)->resize(300,188)->save(); // 第一引数はS3での保存ディレクトリの指定、第二引数はファイル、第三引数はファイル名、第四引数はpublickを指定することで、URLによるアクセスが可能となる Storage::disk('s3')->putFileAs('/', $file, $file_name, 'public'); return redirect('/');

続いて、今やろうとしていて失敗している、「画像URL」経由のコードを添付します。

// upload_url.blade.php <h3>画像URLをアップロード</h3> <form method="post"> {{ csrf_field() }} <input name="url"> <button type="submit">保存</button> </form>
// ThumbnailController.php // 画像を取得する $image = file_get_contents($request->input('url')); //現在のUnixタイムスタンプを利用してファイル名をつける $file_name = time(); //ファイルのリサイズを行う Image::make($image)->resize(300,188)->save(); // 第一引数はS3での保存ディレクトリの指定、第二引数はファイル、第三引数はファイル名、第四引数はpublickを指定することで、URLによるアクセスが可能となる Storage::disk('s3')->putFileAs('/', $image, $file_name, 'public'); return redirect('/');

エラーコード

画像URL経由ではこのようなエラーがでます。

Intervention \ Image \ Exception \ NotWritableException Can't write to undefined path.

また、以下のコードに問題があることがわかっています。

Image::make($image)->resize(300,188)->save();

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

Amazon Linux
PHP 7.2.13
Laravel 5.8

yuki_maitani👍を押しています

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

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

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

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

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

guest

回答2

0

以下のコードで自己解決しました。

$url = $request->input('url'); //現在のUnixタイムスタンプを利用してファイル名をつける $file_name = time(); $file_path = storage_path('app/public' . $file_name); //ファイルのリサイズを行う Image::make($url)->resize(300,188)->save($file_path); // ローカルの画像からファイルを生成 $file = new File(storage_path('app/public/' . $file_name)); // S3へ保存 Storage::disk('s3')->putFileAs('/', $file, $file_name, 'public'); return redirect('/');

投稿2019/04/27 11:31

qiitenai

総合スコア12

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

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

0

ベストアンサー

ドキュメント見ると直接取得できるのでは。保存先を指定してないのでエラー。
http://image.intervention.io/api/make
http://image.intervention.io/api/save

$url = $request->input('url'); $file_name = time(); $file_path = storage_path('tmp/' . $file_name); Image::make($url)->resize(300,188)->save($file_path);

この時点で$file_pathのパスに画像が保存されているので
これをS3にアップロード。
その後tmpファイルは削除。

投稿2019/04/27 05:03

kawax

総合スコア10377

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

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

qiitenai

2019/04/27 08:32 編集

ご回答いただきありがとうございます! kawax様がおっしゃるように上記のコードで storage/tmp/ に保存できました。ありがとうございました。 ただ、S3に保存するところでわからないことがございますので、お手数おかけしますが、もしよければお願いします。 ``` // ThumbnailController.php $url = $request->input('url'); $ext = substr($url, strrpos($url, '.') + 1); //現在のUnixタイムスタンプを利用してファイル名をつける $file_name = time() . '.' . $ext; $file_path = storage_path('tmp/' . $file_name); //ファイルのリサイズを行う Image::make($url)->resize(300,188)->save($file_path); // ここまではうまくいっています。(画像は確かに保存できています。) // S3への保存でエラーが出ています。 $file = 'storage/tmp/' . $file_name; Storage::disk('s3')->putFileAs('/', $file, $file_name, 'public'); return redirect('/'); ``` エラー文 ``` FatalThrowableError (E_ERROR) Call to a member function getRealPath() on string ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問