Open5

Dropbox API お試し

d3d3

まず Dropbox API を利用するアプリを登録する

https://www.dropbox.com/developers

APIの選択 > アプリ用のフォルダに限定するか、Dropbox 全体にアクセスさせるか > アプリの名前 と進む。

d3d3

権限の設定

ファイルの表示とアップロードを行いたいので、以下を許可

  • files.content.write
  • files.content.read

Access Token

Settings タブの Generate access token

この時点で、自分の Dropbox 内の「アプリ」フォルダに作成したアプリ用のファルダができている

d3d3

create-next-app --template typescript で適当なアプリケーションを作成し、APIを試してみる

ファイル一覧を取得する

api/dropbox/list.ts
import { Dropbox } from 'dropbox';

import type { NextApiRequest, NextApiResponse } from 'next';
import type { files } from 'dropbox';

const dbx = new Dropbox({ accessToken: process.env.DROPBOX_ACCESS_TOKEN });

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse<files.ListFolderResult>
) {
  const list = await dbx.filesListFolder({ path: '' });
  console.info(list);
}

Response

result: {
    entries: [],
    cursor: '...',
    has_more: false
  }

フォルダ内は空なので、レスポンスも空。適当なファイルを配置し、再試行。

result: {
    entries: [ [Object] ],
    cursor: '...',
    has_more: false
  }

取れてる

d3d3

フロント側で表示する

pages/index.tsx
import { Suspense } from 'react';
import useSWR from 'swr';

import { fetcher } from '../lib/fetcher';

import styles from '../styles/Home.module.css';

import type { files } from 'dropbox';

const FileList = () => {
  const { data } = useSWR(
    '/api/dropbox/list',
    fetcher<files.ListFolderResult>,
    {
      suspense: true,
      fallbackData: {
        entries: [],
        cursor: '',
        has_more: false,
      },
    }
  );

  return (
    <ul>
      {data?.entries.map((d) => (
        <li key={d.id}>{d.name}</li>
      ))}
    </ul>
  );
};

export default function Home() {
  return (
    <main className={styles.main}>
      <Suspense fallback={<p>loading ...</p>}>
        <FileList />
      </Suspense>
    </main>
  );
}

d3d3

フォルダの場合は、 entries に含まれるエンティティの .tagfolder になるので識別できる

{data?.entries.map((d) => (
  <li key={d.id}>
    {d['.tag'] === 'folder' ? (
      <Link href={d.name}>${d.name}</Link>
    ) : (
       d.name
    )}
  </li>
))}