ฉันกำลังพยายามอัปโหลดไฟล์หรือรูปภาพบนไซต์ D9 ผ่าน json api การทดสอบคือการอัปโหลดรูปภาพผู้ใช้ในเอนทิตีผู้ใช้
ฉันได้ติดตาม เอกสาร หรืออ่าน คำถามเกี่ยวกับแต่ฉันไม่สามารถทำให้มันทำงานได้
ส่วนหน้าทำด้วย Next.js
การทดสอบที่ทำมีดังต่อไปนี้:
ส่วนหน้าถัดไปเรียกเซิร์ฟเวอร์ next.js api:
ชื่อไฟล์ const = SelectedFile.name;
const fr = ใหม่ FileReader();
fr.readAsArrayBuffer(ไฟล์ที่เลือก);
fr.onload = ฟังก์ชัน async () {
const arrayBuffer = fr.result;
ถ้า (arrayBuffer && ประเภทของ arrayBuffer !== 'สตริง') {
const base64String = _arrayBufferToBase64(arrayBuffer);
const cookieSession = รอ getUpdateCookie ();
const res = รอการดึงข้อมูล (`/api/users-test/user?cookie=${cookieSession}&name=${filename}`, {
วิธีการ: 'POST', เนื้อหา: base64String,
});
}
}
ฟังก์ชัน _arrayBufferToBase64 (บัฟเฟอร์: ArrayBuffer) {
ให้ไบนารี = '';
ไบต์ const = ใหม่ Uint8Array (บัฟเฟอร์);
const len = bytes.byteLength;
สำหรับ (ให้ i = 0; i < len; i++) {
ไบนารี += String.fromCharCode (ไบต์ [i]);
}
กลับ window.btoa (ไบนารี);
}
เซิร์ฟเวอร์ api next.js โพสต์ไปที่ Drupal:
const res = รอการดึงข้อมูล (
`${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}/jsonapi/user/user/{userID}/user_picture`,
{
วิธีการ: 'โพสต์',
ส่วนหัว: {
'ประเภทเนื้อหา': 'แอปพลิเคชัน/ออคเต็ตสตรีม'
ยอมรับ: 'application/vnd.api+json'
'การจัดการเนื้อหา': `name="file"; ชื่อไฟล์ = "${ชื่อไฟล์}"`,
การอนุญาต: `ผู้ถือ ${token}`,
},
ร่างกาย: req.body,
}
);
ฉันลองหลายวิธีในการแปลงไฟล์เป็น "ข้อมูลไฟล์ไบนารี" แต่ไม่ได้ผล: รูปภาพของผู้ใช้จะเป็นช่องสี่เหลี่ยมว่างที่มี X เสมอ
อย่างไรก็ตาม หากฉันลองโทรแบบเดียวกันกับบุรุษไปรษณีย์ ไฟล์จะโหลดอย่างถูกต้อง:
สำหรับตอนนี้ ฉันตั้งสมมติฐานว่าปัญหาอยู่ที่โค้ดจาวาสคริปต์ ในขณะที่ Drupal ได้รับการกำหนดค่าอย่างถูกต้อง