4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Next.jsからファイルをAPIにポストしようとしたのですが、調べてもすぐに解決できなかったのでまとめていきます。

問題

以下のようにインプットにいれたファイルを登録できるようにしました

  const [file, setFile] = useState<File>()

  const handleSubmit = async () => {

    const res = await fetch(
      `/api/v1/resources/mappings`,
      {
        method: "POST",
        body: { fle: file }
      },
    );
    const { body } = await res.json();
    setResponse({ status: res.status, body });
  };

そしてNext.jsのAPIでさらに外部APIを叩くようにしています

export async function POST(request: NextRequest) {
  const json = await request.json();
  const formData = new FormData();
  formData.append("file", JSON.stringify(json.file));
  const response: createMappingResponse = await fetch(
    `${process.env.EP_ORIGIN}/api/internal/v1/mappings`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: formData,
    },
  ).then((res) => res.json());
  const status = response.result.failed.length === 0 ? 201 : 400;

  return NextResponse.json({ body: response.result, status });
}

しかしこれではうまくファイルを送ることができあせんでした

解決方法

ファイルの送り方をformdataに包んで送るようにしました
また、handleSubmitの段階で送る時にformdataを使っていなかったので使うようにしました

  const handleSubmit = async () => {
    const formData = new FormData();
    formData.append("file", file!);

    const res = await fetch(
      `/api/v1/resources/mappings`,
      {
        method: "POST",
        body: formData,
      },
    );
    const { body } = await res.json();
    setResponse({ status: res.status, body });
  };
export async function POST(request: NextRequest) {
  const formData = await request.formData();
  const response = await fetch(
    `${process.env.EP_ORIGIN}/api/internal/v1/mappings`,
    {
      method: "POST",
      body: formData,
    },
  ).then((res) => res.json());

  return NextResponse.json({ body: response.result, status: response.status });
}

おわりに

なぜか結構難しいなと感じたのはNext.jsのAPIと外部APIの2回で渡していたのが原因かなと思いました
うまくいったよかったです

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?