- 投稿日:2019-02-18T18:11:41+09:00
axiosでPOSTした画像をLaravel APIで保存する
タイトルの通りです。画像やファイルのstorage保存の記事はいくつか見かけましたが、jsからPOSTする記事についてはあんまり見かけなかったので書きました。
この記事ではaxios経由で画像をPOST、LaravelのAPI処理に渡しているサンプルコードを簡単に説明します。概要は以下の通りです。
- canvasに画像を描画し、blobデータを作成
- blobをformDataにappendして、axiosでPOST
- POSTされたblobファイルを、Laravel API側で処理・保存
View側の処理
データのBLOB化
以下の処理か
toBlob
を使ってCanvasに描画した画像ファイルをblob化します。index.vue// Canvasのデータをblob化 const type = 'image/png'; const dataurl = this.canvas.toDataURL(type); // this.canvasは用途に合わせて書き換え const bin = atob(dataurl.split(',')[1]); const buffer = new Uint8Array(bin.length); for (let i = 0; i < bin.length; i++) { buffer[i] = bin.charCodeAt(i); } const blob = new Blob([buffer.buffer], {type: type});
"multipart/form-data
のデータをPOSTするので、blobファイルをFormData
インタフェースにappendする形でデータを作成します。index.vueconst data = new FormData(); data.append('photo', blob, 'image.png'); //'photo'というkeyで保存blobを格納したdataを
axios.post
の第二引数にセットすれば、POST可能です。index.vueaxios.post('/api/photo', data, { headers: { 'content-type': 'multipart/form-data' } }) .then(res => { console.log('success') }).catch(error => { new Error(error) });Laravel API側の処理
api用のControllerで設定した
store
定義内に、受け取ったblobデータをファイルとして保存するための処理を書きます。View側でFormData
内にappendしたphoto
データを$request
から参照し、storeAs
メソッドを実行することで簡単に保存が可能です。IndexController.phppublic function store(Request $request) { // ファイル名を取得 $filename = $request->photo->name; // blobデータをstorageに保存する // diskの指定を特にしなければ、例の場合。`storage/app/images/`に画像が保存される $path = $request->photo->storeAs('images', $filename); }
- 投稿日:2019-02-18T16:33:39+09:00
mysqlndとphp-pdoを導入するもcould not find driver【php72】
- 環境:CentOS7
- nginx
- MariaDB
- php7.2
[root@---]$ php -v PHP 7.2.15 (cli) (built: Feb 5 2019 18:05:51) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologiesissue
PDO接続にてcould not find driverエラー。
pdoは読み込まれており、下記モジュールは導入済み。
- 加え、systemctl reload php-fpm, nginx
済み。[root@---]# yum list installed | grep mysql php-mysqlnd.x86_64 7.2.15-1.el7.remi @remi-php72 [root@---]# yum list installed | grep pdo php-pdo.x86_64 7.2.15-1.el7.remi @remi-php72解決策
[root@---]$ php -r "echo phpinfo();" | grep PDO PDO PDO support => enabled PDO drivers =>上記にて読み込まれていないことが発覚。
$ sudo yum -y install php72-php-mysql
結果
*$ php -r "echo phpinfo();" | grep PDO
PDO PDO support => enabled PDO drivers => mysql, sqlite PDO Driver for MySQL => enabled PDO Driver for SQLite 3.x => enabled接続良好。
補遺
PDOテスト用に。
<?php try { $pdo = new PDO('mysql:host=localhost;dbname=vanilo;charset=utf8','root','kubosuke', array(PDO::ATTR_EMULATE_PREPARES => false)); } catch (PDOException $e) { exit('データベース接続失敗'.$e->getMessage()); } ?>
- 投稿日:2019-02-18T14:09:05+09:00
Laravel 関連テーブルでの検索方法
前提
Presidentモデル(社長) 1人 に対して
Shopモデル(お店) 複数 が紐づいている状態Laravelの関連テーブルのカラムで検索したい。
社長の名前に
田
がつくお店一覧を出したい場合はこれreturn Shop::with('president') ->select('*', 'presidents.name as president_name', 'shops.name as shop_name') ->leftJoin('presidents', 'presidents.id', '=', 'president_id') ->where('presidents.name', 'LIKE', '%' . 田 . '%') ->groupBy('presidents.id');解説
お店にも、社長にも
name
というカラムがある。
joinするとnameカラムが社長の名前で上書きされてしまう。なので
select as
を使って別の名前に最初に定義し直す。->select('*', 'presidents.name as president_name', 'shops.name as shop_name')
- 投稿日:2019-02-18T14:09:05+09:00
Laravel 関連テーブルのカラムで検索する方法
前提
Presidentモデル(社長) 1人 に対して
Shopモデル(お店) 複数 が紐づいている状態Laravelの関連テーブルのカラムで検索したい。
社長の名前に
田
がつくお店一覧を出したい場合はこれreturn Shop::with('president') ->select('*', 'presidents.name as president_name', 'shops.name as shop_name') ->leftJoin('presidents', 'presidents.id', '=', 'president_id') ->where('presidents.name', 'LIKE', '%' . 田 . '%') ->groupBy('presidents.id');解説
お店にも、社長にも
name
というカラムがある。
joinするとnameカラムが社長の名前で上書きされてしまう。なので
select as
を使って別の名前に最初に定義し直す。->select('*', 'presidents.name as president_name', 'shops.name as shop_name')
- 投稿日:2019-02-18T11:54:18+09:00
[一時メモ]Laravelのbladeのsessionについて
bladeのsessionってなんだこれ?
を読んでください。
php側Route::post('user/profile', function () { // ユーザープロフィールの更新処理… return redirect('dashboard')->with('status', 'Profile updated!'); });blade.php@if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endifザックリ言うと、
redirect()->with()
のメソッドの中でsessionに一時的に保存しているようです。詳しくは後ほど調べます。