Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

posted at

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

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

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

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

紙で申請を出す居酒屋店員のシフト希望と管理業務をちょっとスマートにする

突然nodeという値

こちらに記事で紹介されている 突然の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();

実行してみると

$ 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();

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

$ 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

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

スクリーンショット 2021-08-26 12.07.44.png

参考記事など

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

参考: DirectCloud-BOXにファイルをアップロードするGitHub Actionを作ってみた
参考: Node.js + axios で 画像を mulitpart/form-data でアップロードしようとしてハマった話

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?