10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kintoneのファイルアップロードの実装で詰まった記録

Last updated at Posted at 2025-02-11

はじめまして!!ノベルワークス入社2年目のそうま(@SomaActionPlan)です!!

今日は、kintoneRestAPIを利用した添付ファイルアップロードの実装で詰まった点を備忘録として残そうと思います!!

前提

kintoneには添付ファイルフィールドというフィールドタイプが存在し、さまざまな形式のファイルをアップロードし保存する事が出来ます。

このフィールドにファイルをアップロードするAPIが存在するので、それを使用します。

添付ファイル-説明.drawio.png

詰まった点其1 - Blobオブジェクト

まず最初に、ファイルをアップロードする前に一度ファイルの内容をMIMEタイプを指定してBlobオブジェクトに変換する必要がある点を理解できずに詰まりました。

MIMEタイプ
ファイルの形式や性質を表す種別。
例) jpeg拡張子 -> image/jpeg

Blobオブジェクト
読み取り専用のバイナリーデータを保持するオブジェクト。
https://developer.mozilla.org/ja/docs/Web/API/Blob

blobの作成自体は、以下のコードで実装できました。

const blob = new Blob([<任意のファイル内容>], { type: <任意のmimeType> });

詰まった点其2 - ファイルキーの取得

次にファイルキーの取得までに中々時間がかかってしまったので、以下に手順を残します。

フォームデータの作成

まず初めにフォームデータを作成します。

フォームデータ
webフォームから送信するデータ形式の1つ、キーと値のペアを持つ
https://e-words.jp/w/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%87%E3%83%BC%E3%82%BF.html

const formData = new FormData();

先程作成した Blob オブジェクトを file をキーにしてフォームデータに追加します。

formData.append("file", blob, <任意のファイル名>);

ファイルをアップロードする際、CSRFトークンが必要みたいなので、kintone.getRequestToken を使用しトークンを作成します。

CSRFトークン
webアプリケーションがセッションごとに発行するトークン

const requestToken = kintone.getRequestToken()

生成したトークンを __REQUEST_TOKEN__ をキーにしてフォームデータに追加します。

formData.append("__REQUEST_TOKEN__", requestToken);

これでフォームデータは完成です!

ファイルアップロード

ファイルアップロードAPIでは、kintone REST APIを実行するための関数であるkintone.api()を使用出来ないので fetch APIを使用します。

これに気づくのが遅れてしまい少し詰まってしまいました...。

先程作成した フォームデータを以下のように body に指定します。

const headers = {
    "X-Requested-With": "XMLHttpRequest",
};

const response = await fetch(`https://<kintoneのサブドメイン>}/k/v1/file.json`, {
    method: "POST",
    headers,
    body: formData,
});

これでファイルアップロードが完了し、ファイルキーを取得できます!

詰まった点其3 - ファイルキーとレコードの紐付け

まず最初に、ファイルアップロードのAPIを使用してファイルをアップロードした時点で、そのままレコードにも保存されるものだと思っていました。

そうではなくレコードへの保存には以下のステップが必要でした。

  1. ファイルを一時保存領域に保存する
  2. ファイルキーを取得する
  3. 発行したファイルキーを対象のレコードに保存する

添付ファイル-説明.drawio (2).png

先程のファイルアップロード時に取得したレスポンスデータにファイルキーが存在するので、そのファイルキーを以下のようにしてレコードに保存します。

const fileKey = (await response.json()).fileKey;

const record = {
    <対象の添付ファイルフィールドのフィールドコード> : {
        value: [
            {
                fileKey,
            },
        ],
    },
};

const body = {
    app: <対象のアプリID>
    id: <対象のレコードID>
    record,
};

await kintone.api(kintone.api.url("/k/v1/record.json", true), "PUT", body);

これでレコードへファイルの保存が完了しました!!

纏め

添付ファイルフィールドの更新は、他のフィールドと違い少し手順を踏む必要があるという事を理解できました!今後の実装に役立てていこうと思います!

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?