Node.js（axios）からDirectCloud-BOX APIでファイルアップロード


DirectCloud-BOX APIのAPIを触ってみてました。

なかなか公式情報がなく、Qiitaに書いてくれている皆さんの記事のおかげでなんとか進められるというAPIで苦戦しました。

ちなみにこの実装をもとに作ったのは別記事にまとめてます。

> [紙で申請を出す居酒屋店員のシフト希望と管理業務をちょっとスマートにする](https://qiita.com/n0bisuke/items/0c6d6a236b31e3897d41)

## 突然nodeという値

[こちらに記事](https://qiita.com/tk3fftk/items/ca71fa6af47411d2738a#post-%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AF-form-data-%E3%81%AE%E5%88%A9%E7%94%A8%E3%81%8C%E5%BF%85%E9%A0%88)で紹介されている **突然のnode**。

uploadを試す前に、nodeって値を取得する必要がある模様です。

nodeを無指定でフォルダリストの照会を行うと起点となるnodeの値が取れる模様。
（それでもまたよく分からないけど）

> https://directcloud.jp/api_reference/detail/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC/Folder#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E7%85%A7%E4%BC%9A

```getnode.js
'use strcit';

const axios = require('axios');

const FormData = require('form-data');

const BASE_URL = `https://api.directcloud.jp`;
const URL = `${BASE_URL}/openapp/v1/folders/index/?lang=eng`
const token = `xxxxxxxxxxxxxx`

const main = async () => {
    const bodyFormData = new FormData();

    const res = await axios.get(URL, bodyFormData, {
        headers: {
            access_token: token,
            ...bodyFormData.getHeaders()
        }
    });
    console.log(res.data);
};

main();
```

実行してみると

```bash
$ node getnode.js 
{
  success: true,
  lists: [
    {
      dir_seq: '0000000',
      node: '1',
      name: 'My Box',
      type: 'my',
      datetime: '2021-08-25 09:27:20'
    },
    {
      dir_seq: '0000000',
      node: '1{2',
      name: 'Shared Box',
      type: 'shared',
      datetime: '2021-08-25 08:37:48'
    }
  ]
}
```

みたいな値が取れました。`dir_seq`がそれっぽい値かと思いきやnodeって1とかの数字なんですね。

おそらくフォルダの内部の管理IDみたいなものな気がします。

**`My Box`っていうフォルダでnodeの値は1ってのが分かりました。**

ただファイルをアップロードしてみるだけならとりあえずnodeの値を1って指定で良い気がします（）

## アップロードを試す

ドキュメントはこちらです。 nodeの値がわかったらあとは同じ要領でアップロードの処理も書けました。

> https://directcloud.jp/api_reference/detail/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC/File#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89

ドキュメント上ではエンドポイントは`/openapp/v1/files/upload/{node}`って表記ですが、先程の手順でnodeの値1で良さそうってのが分かったので`/openapp/v1/files/upload/1`という指定にしています。

```upload.js
'use strcit';

const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');

const BASE_URL = `https://api.directcloud.jp`;
const URL = `${BASE_URL}/openapp/v1/files/upload/1?lang=eng`
const token = `xxxxxxxxxxxxxxxxxxxx`

const imageFilePath = `./image.png`;

const main = async () => {

    const bodyFormData = new FormData();
    const file = fs.createReadStream(imageFilePath);

    bodyFormData.append('Filedata', file);
    const res = await axios.post(URL, bodyFormData, {
        headers: {
            access_token: token,
            ...bodyFormData.getHeaders()
        }
    });
    console.log(res.data);
};

main();
```

実行してみたら成功している模様なのでアップロード出来たのだと思います。


```bash
$ node upload.js 
{
  success: true,
  file_seq: 287745501,
  name: 'image.png',
  extension: 'png',
  size: 87082,
  sizetext: '85.04KB'
}
```

## Webアプリで確認出来る！

このWebアプリのURLもよく分からないですがQiitaの誰かのリンクから見つけました。

> https://web.directcloud.jp/home 

まさかこんなページがあるとは。まじでこんなページあるといいなぁって思ってたやつなのですが、あるんですね。

（確認するためにわざわざAPIを叩かないといけないのかと思って試しててだるかったです）

> ![スクリーンショット 2021-08-26 5.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/307b55fd-fc63-6fda-760e-b234faada460.png "スクリーンショット 2021-08-26 5.27.18.png")


実際にアップロードした写真もちゃんと見れます。

> ![スクリーンショット 2021-08-26 12.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/ea8a2b27-eaf5-691f-e895-11c3e4a16fcc.png "スクリーンショット 2021-08-26 12.07.44.png")



## 参考記事など

本当に皆さんの知見に助けられています。ありがとうございます。

> 参考: [DirectCloud-BOXにファイルをアップロードするGitHub Actionを作ってみた](https://qiita.com/tk3fftk/items/ca71fa6af47411d2738a#api-%E3%82%92%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B)
> 参考: [Node.js + axios で 画像を mulitpart/form-data でアップロードしようとしてハマった話](https://qiita.com/kazu_death/items/a94ac4ae4d71928920c5)