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

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

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

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

Q&A

解決済

3回答

3507閲覧

Laravel (intervention/imageライブラリ)における画像保存が出来ない

nyumasa

総合スコア10

Laravel 5

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

0グッド

0クリップ

投稿2019/06/10 06:14

初めて質問させて頂きます。Laravelを勉強しながらWebサイトを作っています。
説明不足の点があるかもしれませんがお力を貸して下さい。

前提・実現したいこと

storageに保存している画像を加工して、加工済を別storageディレクトリに保存したい。

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

コントローラの保存処理(11)にてエラーが発生しています。ソース内の(6)~(10)まではエラーは発生していません。 // (11) 画像本体をストレージに保存 (拡大用) $img->save(storage_path().'/app/public'.$savepath1); 発生しているエラー Can't write image data to path (C:\xampp\htdocs\mydomain\storage/app/public/fa/3/plan/65/)

該当のソースコード

Controller

1namespace mydomain\Http\Controllers; 2use Illuminate\Http\Request; 3use Illuminate\Support\Facades\Storage; /*Storageファサードが使えるようにインポート*/ 4use Intervention\Image\Facades\Image; /*Imageファサードが使えるようにインポート*/ 5 6class PlanController extends Controller 7{ 8 public function plan_add_fin(Request $rq){ 9 $inputdata = $rq->all(); 10 $fa_id = $rq->session()->get('fa_id'); 11 $plan_id = $rq->id; 12 if($rq->inputfile1){ /*添付ファイルあり*/ 13 // (6) 最終保存先パス取得 14 $savepath1 = '/fa/'.$fa_id.'/plan/'.$plan_id.'/'.$rq->save_filename1; 15 dump($savepath1);//"/fa/3/plan/50/" 16 $savepath1_thum = $savepath1.'_thum'; 17 // (7) 画像のインスタンスを作成 18 $rqfile = Storage::path('public/'.$rq->tmppath1); 19 dump($rqfile); //"C:\xampp\htdocs\mydomain\storage\app\public/tmp/1560126778@cabin17.jpg" 20 $img = Image::make($rqfile); 21 // (8) ウォーターマーク挿入 22 $img->insert('storage/img/watermark.png','bottom-right'); 23 // (9) 画像リサイズ (拡大用) 24 $img->resize(500, null, function ($constraint) {$constraint->aspectRatio();}); 25 // (10) 画像サイズ取得 (拡大用) 26 $filesize1 = $img->filesize() / 1000; /* 単位:kbに変換 */ 27 // (11) 画像本体をストレージに保存 (拡大用) 28 $img->save(storage_path().'/app/public'.$savepath1); 29 // (12) 画像リサイズ (サムネイル用) 30 $img->resize(150, null, function ($constraint) {$constraint->aspectRatio();}); 31 // (13) 画像本体をストレージに保存 (サムネイル用) 32 $img->save(storage_path().'/app/public'.$savepath1_thum); 33 }else{ /*添付ファイルなし*/ 34 $savepath1 = null; 35 $savepath1_thum = null; 36 $filesize1 = null; 37 } 38 } 39}

試したこと

saveメソッドの引数の指定方法がおかしいのかと思い単純なパスに変更しても変わりませんでした。

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

環境:Laravel5.8 , XAMMP

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

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

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

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

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

guest

回答3

0

パスが認識できていないのではないかと思いましたので、
xampp 側のDocumentRoot設定を以下に変更してみてはどうでしょうか。

/xampp/htdocs/mydomain

storageパスはこう変わるはず。

/xampp/htdocs/mydomain/storage

投稿2019/06/10 06:51

編集2019/06/10 06:52
nonoichi123

総合スコア17

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

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

nyumasa

2019/06/10 07:26

回答ありがとうございます。 xampp/apache/conf/httpd.confを下記のように書き換え,XAMPPを再起動してみましたがエラー内容に変化がありませんでした。 DocumentRoot "C:/xampp/htdocs/mydomain" <Directory "C:/xampp/htdocs/mydomain"> storage_path()の値はdumpで確認するとC:\xampp\htdocs\mydomain\storageでした。
nonoichi123

2019/06/10 07:31

C: も外すとどうでしょうか?
nyumasa

2019/06/10 07:42

DocumentRoot "/xampp/htdocs/mydomain" <Directory "/xampp/htdocs/mydomain"> に書き換えて再度試しましたが特に変化がありませんでした。 Can't write image data to path (C:\xampp\htdocs\mydomain\storage/app/public/fa/3/plan/70/)
nyumasa

2019/06/11 08:03

単純ミスでしたがなんとか自己解決できました。ご相談乗って頂きありがとうございました。
guest

0

保存先のパスのディレクトリが作成されてないかもしれないので、事前にディレクトリを作成してみてください。

Fileファザードの使い方は、少し古いですが以下が参考になります。
Laravel Recipes ディレクトリを作成する

\File::makeDirectory(storage_path("app/public/fa/3/plan/65"),0755,true);

投稿2019/06/10 06:43

aro10

総合スコア4106

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

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

nyumasa

2019/06/10 07:09

回答ありがとうございます。 この処理の前でディレクトリが存在しない場合は作成するという処理をしていまして、実際うまく作成されていることを確認済です。パーミッションの指定はしていませんが。。。 if (!file_exists(storage_path('public/fa'))) { \Storage::makeDirectory('public/fa'); /* faディレクトリ作成 */ }
aro10

2019/06/10 07:55

書き込めないというエラーなので、ディレクトリが無いか、書き込み権限がないかという事かと思うので、 パーミッションを操作してみて、一度試してみてください
aro10

2019/06/10 07:57 編集

あと私はMac環境を利用していますが、storageより前が、バックスラッシュ\で、それ以降が/というのはWindowsでは正常に動くのでしょうか ``` C:\xampp\htdocs\mydomain\storage/app/public/fa/3/plan/65/ ``` WIndowsで動くやり方に合わせた方が良いかもしれないですね。
nyumasa

2019/06/10 08:30

if (!file_exists(storage_path('public/fa'))) { \Storage::makeDirectory('public/fa',0775); /* faディレクトリ作成 */ } に変更して、一度ディレクトリを削除してから再実行しましたが変化がありませんでした。 \と/が混ざっていますが、ブラウザ表示はすべて/でブラウザのエラー表示部をコピーしてここに貼り付けるとなぜか混ざってしまいます。
nyumasa

2019/06/10 08:48

Homesteadはお勧めなのですね。利用の方、検討してみたいと思います。
nyumasa

2019/06/11 08:03

単純ミスでしたがなんとか自己解決できました。ご相談乗って頂きありがとうございました。
aro10

2019/06/11 08:30

????
guest

0

自己解決

お世話になっております。
なんとか自己解決できましたので報告します。
原因は前処理のbladeファイルから必要なデータを1つ渡し忘れていた単純ミスでした。
Image::makeでインスタンスを作成して使うのは初めてなのに少し複雑なロジックで実行してしまいました。単純ロジックで動作確認だけ先にやっておけば良かったと今更ながら思いました。

Controller

1 // (6) 最終保存先パス取得 2 $savepath1 = '/fa/'.$fa_id.'/plan/'.$plan_id.'/'.$rq->save_filename1; 3 dump($savepath1);//"/fa/3/plan/50/"

dumpで$savepath1の中身を確認したにもかかわらず$rq->save_filename1の値が無く受け取れていないことを見逃していました。「保存ファイル名が無い状態のディレクトリのみを指定して保存」しょうとした為に保存できずにエラーとなっていたようです。

Controller

1 // (11) 画像本体をストレージに保存 (拡大用) 2 $img->save(storage_path().'/app/public'.$savepath1);

▼ 保存ディレクトリのみしか指定していない為にエラー
$img->save(storage/app/public/3/plan/50/);

▼ 正解
$img->save(storage/app/public/3/plan/50/ファイル名);

投稿2019/06/11 08:01

nyumasa

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問