SalesForceからドキュメント(ファイル)を自動でダウンロードする
SalesForceには、書類を共有する仕組みがあり、「ドキュメント」フォルダの
ストレージにファイルを置くことができます。
今回のお客様のニーズは、定期的にSalesForce上にファイルをアップロードしておくので、毎晩、自動でダウンロード(取得)して、システムに取り込んで反映してもらいたい!というものでした。
以前の記事で、お客様アップロードするcsvファイルをSalesForce上のカスタムオブジェクトとして登録する方法を書いたのですが、今回は、SFDCは単なるファイルストレージで、データを取り込む先は、別のシステムとなります。
ユーザとしては、せっかくセールスフォースに契約しているのだから、別にサーバをレンタルするよりも、その資産を有効に活かしたいと考えるのは至極当然ですね。
すでに、JavaのバッチからSFDCに接続し、カスタムオブジェクトをCSVファイルとして書き出す仕組みは作っていたのですが、ファイルそのものをダウンロードするにはどうするのか??
と思っていたのですが、意外にすんなり出来ました。
というのも、SalesForce上では、
多くのモノがSObjectとして認識されている
ので、「Document」オブジェクト型でデータを取得し、そのをそのままローカルのPC上で書き込めば良かった。。
public List getDocuments() throws ApplicationException { List objectList = new ArrayList(); try{ // SOQLの作成 StringBuffer selectQuery = new StringBuffer(); selectQuery.append("SELECT "); selectQuery.append("Id, "); selectQuery.append("Name, "); selectQuery.append("Body "); //Domument本体 selectQuery.append("FROM "); selectQuery.append("Document "); selectQuery.append("where IsDeleted = false "); // クエリ実行 QueryResult rs = binding.query(selectQuery.toString()); // 検索結果の取得 boolean done = false; if (rs.getSize() > 0){ while (!done) { // 検索結果をリストに格納 for (SObject so : rs.getRecords()) { objectList.add((Document)so); } } } }catch(Exception ex){ throw new ApplicationException("SFDC情報の取得に失敗しました。",ex); } return objectList; }
上記のソースで、SOQLによりDocumentオブジェクトを取得します。
後は、そのオブジェクトのBody部分を、以下のようにファイルとして書き出します。
private void writeDocumnets() throws ApplicationException,IOException{ File csvFile = null; FileOutputStream writer = null; List ctInfoList = sfSession.getDocuments(); try { if (ctInfoList.size() iter = ctInfoList.iterator(); while(iter.hasNext()) { Document _op = iter.next(); writer = new FileOutputStream(_op.getName()); writer.write(_op.getBody()); if (writer != null) { writer.close(); } } } finally { if (writer != null) { writer.close(); } } }
ちなみに、Documentオブジェクトでは
一回のファイルアップロードに5Mのガバナ制限があるよう
で、5M以上のファイルをアップロードするとエラーメッセージが出たのですが、Chatterの添付ファイルにはそのような制限は無いという話も聞きました。
コラム
salesforce関連の本って少ないですよね。また、Web上の情報は詳しいのですが、広大すぎて、調べようと思ったときに手元にリファレンス的な本があると助かります。以下は私のおすすめの本です。
Force.comのすべて ~設計・開発 実践マニュアル~ 初めてSalesForceでWebアプリを作ろうとしたとき、どこから手を付けていいか迷いました。そんなときに役立つ初心者向けの本です。細かいところに手が届くたぐいの本ではないですが、一通り、体系的に学べるので、役に立ちます。
改訂新版 Salesforceプログラミングバイブル すこし高い本ですが、豊富なソースが載っており、上の本を勉強して次の段階に進んだ技術者には役立。こんなことってSalesForceでできないの?と思ったときにも役に立ちます。
タグ:java, Salesforce
getDocuments()メソッドで、boolean doneがfalseになるのはどこでしょうか?
あと、SOQLのselect結果にBody(バイナリ)が含まれる場合、1レコードしか返却されないと思いますが、これは実際に動作しているものでしょうか。