🐘

無料で使えるFilestackをPHPで使ってみた

2020/05/02に公開

Filestack は、S3のようなストレージ機能とimgixのような画像処理機能を提供してくれるサービスです。(多分)

無料でもそこそこ使えそうだった ので試しにPHPのプロジェクトに導入してみました。使い方などをメモしておきます✋

今回は完全にストレージとしてしか使わなかったので、画像処理の機能については触れません🙏

ダッシュボードの見方

サインアップすると以下のようなダッシュボードが表示されます。

トップページには利用状況などが表示されているだけで、アップロードしたファイルをどこで見れるのかが一瞬分からなかったのですが、左のメニューの CONTENT BROWSER というところにありました。

以下のような画面です。ファイル検索機能は有料プランでしか提供されていないようです。

PHPからファイルをアップロードしてみる

PHPからFilestackのAPIを利用するには、公式で提供されているSDK を使えばOKです。

とりあえずファイルをアップロードして公開URLを取得するだけなら、README のとおりにやれば簡単に実現できます。

$ composer require filestack/filestack-php
use Filestack\FilestackClient;

$client = new FilestackClient('YOUR_API_KEY');
$filelink = $client->upload('/path/to/file');
$publicUrl = $filelink->url();

こんな感じ。めちゃめちゃ簡単ですね👍

ちなみにAPI KeyはFilestackのダッシュボードの画面右上の↓にあります。

アップロードしたファイルを削除できるようにするには色々対応が必要

今回の僕のユースケースではアップロードしたファイルをあとから削除できるようにしたかったのですが、それを実現するとなった途端色々と対応が必要でした😓

READMEのこの辺

# delete remote file
$filelink->delete();

とか書いてあるので、ハイハイそれで削除できるのねと思って

use Filestack\Filelink;
use Filestack\FilestackClient;

// アップロード
$client = new FilestackClient('YOUR_API_KEY');
$filelink = $client->upload('/path/to/file');
$handle = $filelink->handle;

// 削除
$filelink = new Filelink($handle, $client->api_key);
$filelink->delete();

みたいにやってみたのですが、APIレイヤーで「許可されていません」的なエラーが返ってきて削除できませんでした。

APIリファレンス を見てみると This request requires security. とか書かれており、どうやらファイル削除の操作をする場合はあらかじめ適切にセキュリティ設定をした上でリクエストに セキュリティ情報を付加する 必要があるようです。

この辺のドキュメント を見ても、ファイルのアップロードはデフォルトで認証が必要ないけど既存ファイルの変更には必要、と書かれています。

セキュリティ機能をONにして適切に設定した上でPHPから使うための手順

具体的な手順を説明します。

まず、ダッシュボードのメニューから SECURITY > Policy & Signature を開きます。

以下のような画面が現れるので、 Use Security をONにします。

続いて、セキュリティ付きのAPIを利用する際にリクエストに付加するための各種パラメータを準備します。

最終的には、この画面で得られる下図の赤枠4箇所の情報が必要になります。

上の2つ、 API KeyApp Secret は与えられているものをそのまま使えばよいですが、下の2つは用途にあわせて自分で作成する必要があります。

それぞれ URL Safe Base64 encoded PolicyHMAC-SHA256 Signature in hex というラベルが書いてありますが、意味は以下のとおりです。

  • Policy :許可するスコープや有効期限などの設定を表すJSON文字列(PHPから使うのはそれをBase64エンコードした文字列)
  • Signature :Policyの内容とシークレットを元に生成した署名

画面中央のフォームを入力することでこれらの値が生成されます。実際に入力してみましょう。

有効期限は必須 なので、ユースケースにあわせて適切な期限をセットしましょう。

あとは Call のところがいわゆるスコープの選択なので、こちらのドキュメント を参考に、必要なスコープにチェックします。

「アップロード」「アップロードしたファイルの閲覧」「アップロードしたファイルの削除」ができればOKなら、選択するのは pick read remove の3つになります。

これで、以下のようにPolicyとSignatureが得られました。

あとはPHPのSDKでこれらの情報を使ってクライアントを初期化すればOKです。

この辺の正しいやり方、SDKのドキュメントからどうも見つけられなかったので、SDK自体のコードを追ったり テストコード を参考にしたりしました。

コードとしてはこんな感じになります。

use Filestack\FilestackClient;
use Filestack\FilestackSecurity;

$security = new FilestackSecurity('App Secretの文字列');
$security->policy = 'Base 64 encoded Policyの文字列';
$security->signature = 'Signatureの文字列'

$client = new FilestackClient('API Keyの文字列', $security);

参考までに、Symfonyのサービスとして定義するなら以下のような感じです。

# .env

FILESTACK_API_KEY=
FILESTACK_SECURITY_SECRET=
FILESTACK_SECURITY_POLICY_BASE64=
FILESTACK_SECURITY_SIGNATURE=
# config/services.yaml

Filestack\FilestackSecurity:
    arguments:
        - '%env(FILESTACK_SECURITY_SECRET)%'
    properties:
        policy: '%env(FILESTACK_SECURITY_POLICY_BASE64)%'
        signature: '%env(FILESTACK_SECURITY_SIGNATURE)%'

Filestack\FilestackClient:
    arguments:
        - '%env(FILESTACK_API_KEY)%'
        - '@Filestack\FilestackSecurity'

これで適切にセキュリティを有効にしたクライアントが作れました。このクライアントを使えば以下のようにファイルの削除が可能です。

// アップロード
$filelink = $client->upload('/path/to/file');
$handle = $filelink->handle;

// 削除
$filelink = new Filelink($handle, $client->api_key, $client->security);
$filelink->delete();

ただ、今度はファイルの閲覧にも注意する必要があります。セキュリティを有効にしたことによって、ファイルを閲覧するときにも クエリパラメータでセキュリティ情報を渡さなければならなく なっています。

具体的には $filelink->url() で得られるURLに ?policy={Base64 encoded Policyの文字列}&signature={Signatureの文字列} を付加すればよいのですが、このURLは手動で組み立てなくても FilestackSecurity::signUrl() メソッドを使えば作ってもらえます。

なので、閲覧用のURLを取得するためのPHPのコードは以下のようになります。

// アップロード
$filelink = $client->upload('/path/to/file');
$unsignedUrl = $filelink->url();

// 閲覧用URL取得
$accessibleUrl = $client->security->signUrl($unsignedUrl);

まとめ

  • 無料から使えるストレージサービス Filestack をPHPで利用する方法を解説しました
  • アップロードしたファイルを変更・削除したい場合はセキュリティ機能をONにして適切に処置する必要があるので覚えておきましょう
GitHubで編集を提案

Discussion