Programming

画像アップロードのお話と僕が作っているもの [for Laravel Advent Calendar 2014]

 Author:fumiyasac

Laravel Advent Calendar 2014 21日目担当の fumiyasac です。よろしくお願いします。
以前にも画像アップロードのライブラリであるlaravel-staplaerについて簡単な解説を行いました。今回は、自分が最近Railsで仕事をしていることやこのライブラリがRailsのPaperclipにインスパイアされて作られていたので、せっかくなので見比べしようと思いました。

1. laravel-staplerについて

【特徴とかイントロダクション】

以前に作成しました、下記のエントリーにて概要やを紹介・導入してみた的な記事を形成しています。
本家のドキュメントへのURL等も掲載しておりますが、3ヶ月以上経過しておりますので、自分が掲載している情報等と差異がある場合はお申し付け下さい。

その当時に導入する時に参考にした際はこちらになります。

2. 実際にRail4でのPaperClipでのソースとlaravel4.2のソースを見比べて見る

【実際の所どの位似ているの?】

実際に導入した際はそれほどRailsに慣れていない(scaffoldで管理画面をこしらえたくらい)こともあったのですが、実際に使ってみると書き方が本当に似ていて驚いたので、今回はまとめてみます。

【1. 導入する前】

[Laravel4.2 : composer.json]

  1. "require": {
  2.     "codesleeve/laravel-stapler": "1.0.*"
  3. }

[Rails4 : Gemfile]

  1. gem "paperclip", '~> 4.2'

【2. モデルファイル】

このライブラリを使う際にはこの表記が必要です。
簡単に言えば、「このクラス使うよー」という宣言をしてあげる表記が必要になります。

[Laravel4.2 : example.php]

  1. use Codesleeve\Stapler\ORM\StaplerableInterface;
  2. use Codesleeve\Stapler\ORM\EloquentTrait;
  3. class Example extends Eloquent implements StaplerableInterface {

[Rails4 : example.rb]
paperclipを使う場合には、「このクラス使うよー」という宣言はいらない感じです。

そして画像の投稿に関する設定は下記のようになります。
RubyとPHPなので表記が異なるのは、仕方ない部分がありますが、意外にも設定方法なんかはかなり似ています。ちなみに下記に挙げる例というのは画像をAmazonS3へのストレージに入れる例を考えています。

※Laravel4.2のソースにつきましては検証ができていませんので、下記のURLを元に書きました。もし間違いがあればご指摘下さい。

Laravelではコンストラクタの中に画像処理に関することを宣言する必要があります。

[Laravel4.2 : example.php]

  1. public function __construct(array $attributes = array()) {
  2.     //画像の投稿設定
  3.     $this->hasAttachedFile('image', [
  4.         'styles' => [
  5.             'thumb' => '100x100#',
  6.             'medium' => '200x200#',
  7.             'medium' => '640x320#'
  8.         ],
  9.         'storage' => 's3',
  10.         's3_client_config' => [
  11.             'key' => 'yourPublicKey',
  12.         'secret' => 'yourSecreteKey',
  13.         'region' => 'yourBucketRegion'
  14.         ],
  15.         's3_object_config' => [
  16.             'bucket' => 'your.s3.bucket'
  17.         ],
  18.         'url' => '/system/(クラス名)/:id/:style/:filename'
  19.     ]);
  20.     parent::__construct($attributes);
  21. }

[Rails4 : example.rb]

  1. #添付ファイルアップロードに関する設定
  2. has_attached_file :image,
  3. :styles => {
  4.     :thumb => "100x100#",
  5.     :medium => "200x200#",
  6.     :large => "640x320#"
  7. },
  8. :storage => :s3,
  9. :s3_permissions => :private,
  10. :s3_credentials => "#{Rails.root}/config/s3.yml",
  11. :path => ":class/:attachment/:id/:style.:extension"

実は探してみると、Railsに似たライブラリやサンプルソースなんかを探してみると結構おもしろいものが見つけられるかもしれませんね。

3. 僕が作っているもの

最近はiOS(Objective-C & Swift)でアプリを作ったり、現場ではRailsを書いたりして最近はPHP自体がご無沙汰だったのですが、laravelはアプリ開発のどこかでぜひとも使ってみたいなと思っています。

今作ろうとしているアプリやWebサービスは下記の通りです。

[iOS App]

  • 家計簿に関するやつ(開発中)
  • 旅行に関するやつ
  • 釣りに関するやつ
  • 郷土料理に関するやつ
  • お酒に関するやつ

[Web Service]

  • 金沢に関するやつ
  • 大塚に関するやつ

本業も楽しいですし今は本当に貴重な経験をさせていただいているので、簡単に捨てるつもりは全くないですが、きちっと両立をしてプライベートデベロッパーとして「楽しみながら攻める」を心がけて行きたいです。元々はPHPerなので愛着がありますので、事例を作れるように進んで行こうと思います。