0
0

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.proxyでWordPress ACF APIに画像をアップロードできなかった話

Last updated at Posted at 2025-09-17

こんにちは。@takokkeです
現在、地方のWebマーケティングの会社で、長期インターンを行なっています。
来年からSEになるということもあり、スキルアップのために、業務から吸収する日々・・・と言いたいところですが、最近は惰性でやっており、お金が目的になっちゃってます。

背景

kintoneとWordPressを連携する案件で、レコード編集時にWordPressのACF APIを叩いて画像をアップロードする仕組みを作ろうとしました。

最初は「kintone.proxyを使えばCORS問題も回避できるし楽勝!」と思っていたのですが…実際にやってみると色々ハマったので備忘録としてまとめます。

試したことと結果

1. kintone.proxy + バイナリ送信

まずはバイナリをそのまま送信してみました。

// ここにバイナリ送信のコード例を載せる

しかし結果は 「権限がない」エラー。

ただし、同じユーザーでWP管理画面から直接アップロードは可能でした。

2. kintone.proxy + FormData送信

次にFormDataを使って multipart/form-data で送信。

// ここにFormData送信のコード例を載せる

しかし今度は
「Content-Dispositionを指定しろ」 という謎エラーが発生。

通常、FormDataを使えば自動で付与されるはずなので、これは明らかに挙動がおかしい…。

3. WordPress側の問題かどうか、Postmanで検証

「WordPress側の問題か?」と思い、Postmanでテスト。

バイナリ送信 → 成功

FormData送信 → 成功

この時点で、WordPressやACF API自体には問題なし、kintone.proxy特有の制約と確信しました。

4. fetchで直接リクエスト

最後に fetch() を使って、kintoneから直接WordPress APIを叩いてみました。

// ここにfetchでFormData送信するコード例を載せる

結果は 問題なくアップロード成功! 🎉

得られた知見

kintone.proxyはJSONやBase64文字列転送には強いが、バイナリやmultipart/form-dataには弱い。

WordPress ACF APIの画像アップロードにはFormData必須。

画像などのバイナリを扱う場合はfetchを使った方が安定する。

まとめ

今回の学びを一言でまとめると:

kintone.proxyはCORS回避には便利だけど、ファイルアップロードには不向き。
画像を扱うなら素直にfetchでやった方が早い。

追記:kintone.proxy.upload が存在した

記事を書いたあとで気づいたのですが、公式には kintone.proxy.upload というメソッドが用意されていました。
これを使えば、通常の kintone.proxy よりも直感的にファイルアップロードができます。

公式ドキュメント:
https://cybozu.dev/ja/kintone/docs/js-api/proxy/kintone-proxy-upload/

サンプルコード:

(async () => {
  // kintoneファイルフィールドから画像ファイルを取得する場合
  // ここではテスト用にBlobを生成
  const blob = new Blob(['ダミー画像データ'], {
    type: 'image/png',
  });

  const data = {
    format: 'RAW',   // バイナリとして送信
    value: blob
  };

  try {
    const resp = await kintone.proxy.upload(
      'https://example.com/wp-json/wp/v2/media',  // WPメディアアップロードエンドポイント
      'POST',
      {
        'Authorization': 'Basic ' + btoa('wp_user:application_password'),
        'Content-Disposition': 'attachment; filename="sample.png"',
        'Content-Type': 'image/png'
      },
      data
    );

    // アップロード成功時のレスポンス
    console.log(resp);
  } catch (error) {
    console.error(error);
  }
})();

今回は fetch で解決しましたが、もし今後kintone.proxy経由でファイルを扱う必要がある場合は、こちらの kintone.proxy.uploadを試すのがベストプラクティスかもしれません。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?