Salesforce でBox APIを使う

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


[ログインページ](https://account.box.com/login?redirect_url=/files&logout=true)

思ったより難しいので、考えをまとめるために記録しておきます。１日では解決できません。何を調べたかを忘れそうです。


元の質問 : [BoxにAPI接続がしたい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDHwc)


[BOx APIのリファレンス : ファイルバージョンをアップロード](https://ja.developer.box.com/reference/post-files-id-content/)


CURLの例ではこうなっているが、Json形式ではどうなるのかな？　特にファイルの指定が理解できん。Linuxなら Bulk APIの書き方と同じようです。
この３つのフィールドが必須みたいなのは、理解できるがパラメータの表示の仕方が分からない。

```
curl -i -X POST "https://upload.box.com/api/2.0/files/12345/content" \
     -H "Authorization: Bearer <ACCESS_TOKEN>" \
     -H "Content-Type: multipart/form-data" \
     -F attributes='{"name":"Contract.pdf", "parent":{"id":"11446498"}}' \
     -F file=@<FILE_NAME>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/146a3550-33fb-5547-8a08-c999b3c407af.png)


CURLの例からこんなJsonをイメージしたけど　ファイルのところが分からない。

```
"data":{"attributes":{"name":"testFile","parent":{"id":"0"}},"file":"mary had a little lamb."}}
```

更にファイルの関係を調べてみると

+ [Salesforce内から既存のBoxフォルダにファイルをアップロードする方法を知っている人はいますか？](https://salesforce.stackexchange.com/questions/10287/does-anyone-know-how-to-upload-a-file-from-within-salesforce-up-to-an-existing-b)

両方のプラットフォームが異なる形式のファイルを処理することがわかりました。Salesforceは通常、データをbase64形式で保存しますが、BOX.netはそれらをバイナリとして想定しています。そのため、ファイルをボックスにアップロードしている間、ファイルが破損し、ブラウザを使用してbox.netにアクセスすると、ファイルを表示できなくなります。

えええ、バイナリかい。

おまけに　Saesforceからはバイナリは送信できないことが書かれている。ああ、詰んだな。

http://enreeco.blogspot.com/2013/01/salesforce-apex-post-mutipartform-data.html


最終的にはこれを使わないと難しいかもと思って、ソースコードを覗いてみると
https://github.com/box/box-salesforce-sdk　

無いんですね、Fileのアップロード機能は... 代わりと言えば既にBox上にあるファイルについては操作できそう。BoxFileというｵﾌﾞｼﾞｪｸﾄにオプションがあります。

UploadというのがついたオブジェクトはBoxUploadEmail があります。　もしかしてメール経由でアップする？

[メールを使用したBoxへのアップロード](https://support.box.com/hc/ja/articles/360043697534-%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9FBox%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89)

しかし、更に調べてみると

[Apexを使用したSalesforceとBoxの統合](https://techdicer.com/salesforce-and-box-integration-using-apex/)

apexクラスでは、BLOBをBoxに直接アップロードできないため、これをバイナリデータに変換して、BoxStorageにアップロードします。

この部分が欲しいものかもしれない。

```
//code to upload files to BOX.COM
    @AuraEnabled
   public static String uploadFile(String base64, String filename, String folderId){
        String accessToken = getAccessToken();
        if(base64!=null){
            blob base64EncodeFile = base64EncodeFileContent(EncodingUtil.base64Decode(base64), filename);
            String uploadEndPointURL='https://upload.box.com/api/2.0/files/content?parent_id='+folderId;
            String boundary = '----------------------------741e90d31eff';
            String body = '{"name":"' + filename + '", "parent":{"id":"' + folderId + '"}}';
            HttpRequest req = new HttpRequest();
            req.setBody(body);
            req.setBodyAsBlob(base64EncodeFile);
            req.setHeader('Content-Type','multipart/form-data; boundary='+boundary);
            //req.setHeader('Content-Length',String.valueof(req.getBodyAsBlob().size()));
            req.setHeader('Authorization', 'Bearer ' + accessToken);
            req.setMethod('POST');
            req.setEndpoint(uploadEndPointURL);
            req.setTimeout(120000);
            //Send request to Box
            Http ht = new Http();
            HTTPResponse res = ht.send(req);
            
            System.debug('**Files upload Response: ' + res.getBody());
            Integer uploadStatusCode=res.getStatusCode();
            if(uploadStatusCode==201){
                return 'File uploaded successfully.';
            }else{
              throw newMessageException('Error encountered. Status Code: ' + uploadStatusCode);                
            }
        }else{
            throw newMessageException('Please select file.');
        }
   }
```

# 関連しそうな資料

+ [BoxとSalesforceの統合](https://www.sfdcstuff.com/2015/06/box-and-salesforce-integration.html)
+ [Salesforce Apex クラスを介した Box 共有リンク](https://support.box.com/hc/en-us/community/posts/360049146374-Box-Shared-Link-through-Salesforce-Apex-Class)
+ [Box for Salesforce 統合の紹介](https://support.box.com/hc/en-us/articles/360044195693-Introducing-the-Box-for-Salesforce-Integration)

# 質問

+ [Box - Parent Folder ID](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IRSwS)


# Box for Salesfroce

+ [Box for Salesforceのインストールと設定](https://support.box.com/hc/ja/articles/360044195713-Box-for-Salesforce%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E5%AE%9A#BfS_initialsetup)
+ [Box for Salesforceの設定](https://qiita.com/Keiji_otsubo/items/d269849aabb5f4ea49ac)