SalesForceからドキュメント(ファイル)を自動でダウンロードする

SalesForceには、書類を共有する仕組みがあり、「ドキュメント」フォルダの

ストレージにファイルを置くことができます。

今回のお客様のニーズは、定期的にSalesForce上にファイルをアップロードしておくので、毎晩、自動でダウンロード(取得)して、システムに取り込んで反映してもらいたい!というものでした。

以前の記事で、Salesforceの画面からcsvファイルをアップロードし、カスタムオブジェクトを生成(登録)する方法を書いたのですが、今回は、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の添付ファイルにはそのような制限は無いという話も聞きました。