前提
Next.js × TypeScriptで画像送信フォームを作っています。
画像を選択してプレビューを表示するところまでできたのですが、送信でうまくいかないです。
実現したいこと
- 複数画像の送信
- サーバー内で画像の保存
発生している問題
フロント側の送信部分(一部抜粋)
TypeScript:index.tsx
1const data: postData = { 2 name: inputNameRef.current?.value, // 投稿名 3 files: images, // 画像データ配列のstate 4}; 5 6const post = await fetch(`${window.location.href}api/upload`, { 7 method: "POST", 8 headers: { 9 "Content-Type": "application/json", 10 }, 11 body: JSON.stringify(data), 12});
サーバー側のPOST
TypeScript:upload.ts
1import type { NextApiRequest, NextApiResponse } from "next"; 2type Data = { 3 name: string; 4}; 5export default function handler( 6 req: NextApiRequest, 7 res: NextApiResponse<Data> 8) { 9 10 console.log(req.body); // ここでnameしか確認できない 11 12 res.status(200).json({ name: "!!!" }); 13} 14
req.body
の出力結果が以下のようになる
TypeScript
1{ name: 'TEST', files: [ {}, {} ] }
画像を2枚選択して送信したのだが、files
の中身が空のオブジェクトになっている
試したこと
- 画像のデータを
useRef
で取得する new FormData
を使う- なぜか
req.body
内が文字化けした
- なぜか
追記
FormDataを使った場合
以下で送信はできた
TypeScript
1const formData = new FormData(); 2formData.append("name", name || ""); 3 4for await(const [i, v] of Object.entries(images)) { 5formData.append("files", v ); 6} 7 8 9const post = await fetch(`${window.location.href}api/upload`, { 10method: "POST", 11body: formData, 12}); 13 14console.log(await post.json()); 15
ただし、サーバー側でのconsole.log(req.body);
の中身が以下のようになって解析できない…
// …省略 ������;�������|k����^}owa�<�+n�>��hM�n�նU ���t���ѿ���]G��_���������1���X�� A&�29똺�;�������{���?����q�'@fΣ��]\��3���5��.����~Z��uw?�v�ak���?n�����du�����]��3�h���|��f=6K�h/#���k���T���J��u�+{��:�}G������ ���'���뫋�g>eo���L��V��������Y$�r� W�WI��gi��_��_�^s� �?c�U�˕�w�H�w_F�e^���+��{�BW��GU�/嵉?s��&ߛms����[��'���������9'ߓ����Y�r�kN+��w��Kx-���:o��tK�-���ׄ�Y״u��G� �|��Y���Z��k���o���UO��g��O�[P����w�����!)?ܫ�槨��?���z���w�+�^y0ǽ�J�/����l������>c�:f��#�.-!K{���~�W��.�Mro��x��/�k����?��ڕ�����?��+i�3�!�x�J�;Ǹ�m��7ݮG·W���?ޭ������j��R����)���>#���'��I������Ѯ����h����&�d{��8�?1��i��.���+Q��o�jE4O�X$��7˾x��[����$����%���-wW'c���/���qQ�I��CY�����W�T�n} �-!��H����<��U� ��7�#O�u_�zԷ_��mU�O����i�K����ǎKO9.><ϙ���#�ҿ �I�%���<�c��������y���������������t{����[�G����o<���{�Ͽ�8�j�?����ڕ��� I�\��s�4K��70\F�G��gܯU���湣�I�[���ٷ���������c���Q?������=C�S������#yk�W��r;��[�n�^��e�=?�z�� �?�e|5�������rV�3>�}*84�{����߯�Ŧ���{gg�I�e��}5���d�&� &Lq���7]2��}68<+��c��vW��Z����ϸu������|Y�����O����.���� ------WebKitFormBoundarywYqLipnWjIwkPquM--
回答2件
あなたの回答
tips
プレビュー