herokuに画像を保存してみた【php】
部署内での情報共有のツールとして簡単なアプリを作ってみたのですが、画像も投稿できるようにしてほしいという要望がありやってみました。
画像の投稿に関してはローカルな環境でしかやったことがなかったので若干心配ではあったのですが、問題点はそこではなく調べてみるとherokuという環境でというほうにむしろ問題があるようでした。
”heroku 画像” で検索すると「表示されない」とか「消える」といった厄介そうなものがずらっと並び簡単にはいかなそうでした。
なぜそんなことになっているかというと、herokuでは画像が生成されないらしく(厳密には生成されるが一定時間が経過すると消えるらしい)、データベースに生成された画像のパスを記録するやり方では、画像自体が消えてしまうため当然表示されることありません。
解決方法はいくつかありましたが、お金がかからず一番簡単そうなバイナリで保存する方法にしてみました。
(データベースはClearDB MySQL という無料のものを使っています)
<form action="test.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<input class="submit" type="submit" value="投稿する">
</form>
フォームはざっくりとこんな感じ。
特に変わったところはありません。
$image = file_get_contents($_FILES['image']['tmp_name']);
$binary_image = base64_encode($image);
POSTされた画像ファイルをこのようにバイナリデータに変換。
変換された$binary_imageをデータベースに書き込んで無事に登録完了。
普通ならmove_uploaded_file関数を使ってtmpフォルダに書き込まれた画像ファイルを消えないように別のフォルダに移動したりする工程があるのですが、herokuの場合はどうせ消えてしまうのでその工程は必要ありません。
<img src="data:image/png;base64,<?php echo データベースのバイナリデータ;?>" >
画像の表示はこう。
コードだけみると短くて単純なものなのですが、よくわからない世界でしたので結構苦労しました。
うまくいったと喜んでいたのも束の間で、なぜだか画像の一部しか表示されない現象が発生しました。
これは運良くすぐに原因が突き止められ、型をTEXTからLONGTEXTに変更することで修正できました。単純にデータが大きすぎてTEXTでは入りきらなかったようです。
さらに大きな問題は、ClearDBの無料のプランでは容量が5MBしかないということ。数枚程度の画像しか保存できません。
こればっかりはどうしようもないので、現在他の方法を探っている最中です。
この記事が気に入ったらサポートをしてみませんか?