忙しかったはずなのに、ちょっと時間が空いてしまって戸惑い中ですこんばんは。こんにちは?
以前、ファイルの文字コードを判定&変更するプラグインを作成したりしました。
ここで、一つ問題が。
PrivateファイルはJsなどからアクセスできない
File Uploader’s value:encoded in base64 の値って、Private化したファイルだとアクセス不可能なんでしたっけ・・・?
プラグイン内でPrivate化されたファイルを取得した場合は見られないことはわかっていたのですが、大丈夫だったからbase64にしたはずだったんですよね。。
まぁそんなこんなで、同じロジックで書いたシステムでのバグ報告がありまして。原因はアップロード前のCSV文字コードチェックでJavaScript内でエラーが起きて、アップロードできないよってことでした。
APIでファイルをPrivate化してアップロード
まぁそういう問題があったわけで、Private化してファイルをアップロードする方法を試したわけですね。
フォーラムを検索して存在は知っていたのですが、試したことはなく、今回とうとう実装しました。
API Connectorをインストール
ファイルアップロードをAPI Connectorを使って設定していきます。
まずはAPI Connectorをインストールしておいてください。
API Tokenを作成
Settings > APIタブからAPIを有効にし、API Tokenを作成します。API Token Labelは任意で良いです。

API Connectorの設定
Plugins タブからAPI Connectorを選択し、Add another APIをクリックします。

API Nameをわかりやすい名前でつけておきます。
Shared headers for all callsで、
・Key : Authorization
・Value : Bearer <APIキー>
とします。BearerとAPIキーの間に半角スペースを入れてください。

次に実際のAPI呼び出しを書いていきます。
各パラメータは以下のように設定してください。

エンドポイントは アプリURL/version-test/fileupload です。
ここで、エンドポイントに開発環境/本番環境を切り替える「/version-xxx/」をパラメータで入れておくと便利です。
パラメータ | 内容 |
---|---|
contents | ファイルのbase64データ |
private | private化する場合はtrue、しない場合はfalse |
attach_to | private化する場合のレコードのunique_id ※テストではユーザーのunique_idを利用 |
name | 保存するファイル名 |
テストでcontentsに設定する内容は、以下のようなサイトを利用して、適当なテキストファイル等をbase64エンコードし、設定しておきます。
ではここで、initialize callをクリックしてみましょう。


うまくいくと、このようにアップロードされたURLが返ってきます。
アップロードされたファイルの確認
最後に、アップロードされたファイルを確認しておきましょう。
Data > File Managerタブからファイルを検索してみてください。
Attached toに設定した値が入っていると思います。

ワークフローから、ファイルをアップロードする
それでは、設定したAPIを使ってワークフローからファイルをアップロードしてみましょう。
画面にFileUploaderとボタンを配置します。ここではFile Uploaderの Make this file privateはチェックを入れずにおきます。

ボタンクリック時のワークフローを設定していきます。

ボタンクリック時のアクションを先ほど設定したAPI Connectorを選択し、それぞれ画像のようにFileUploaderの値を利用します。
エンドポイントのパラメータ「ver」は、isn’t live version:formatted as textを利用すると楽ちんです。
プレビューして実行してみよう
実行後にFile Managerを見てましょう。

API Connectorを経由してAPIでファイルアップロードが行えました!
ただし、File Uploaderに指定したファイルはPrivate化されずにストレージに残っています。見られたくないファイルのはずですので、ワークフローで削除してくださいね。
さいごに
以上のような手順でAPI経由でのファイルアップロード&Private化ができました。
若干面倒ではありますが、bubbleの仕様上、一度アップロードしたもののアクセス権変更ができませんので仕方ありません。。
実際の実装では、以下のような感じでワークフローを組んでいます。
プラグインによるファイルの文字コードチェック
→問題なければAPIでファイルアップロード
→(その他処理)
→File Uploaderのファイル削除
その他処理の中で、File Uploaderのファイルを利用しているので、すべての処理終了後にFile Uploaderのファイルを削除しています。
その他の処理がキャンセルされる場合にも、File Uploaderのファイル削除をしています。