Score:0

อัปโหลดไฟล์ \ รูปภาพผ่าน json api อย่างไร

ธง br

ฉันกำลังพยายามอัปโหลดไฟล์หรือรูปภาพบนไซต์ 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 ได้รับการกำหนดค่าอย่างถูกต้อง

id flag
หากมีคำถามอยู่แล้ว เราก็ไม่จำเป็นต้องถามอีก
Giuseppe avatar
br flag
@cilefen น่าเสียดายที่รหัสในคำถามนั้นใช้ไม่ได้สำหรับฉัน ไม่เช่นนั้นฉันคงทำงานไปแล้ว ตัวอย่างเช่น ข้อความผ่านเซิร์ฟเวอร์ api Next เป็นชั้นพิเศษที่คำตอบอื่นไม่ครอบคลุม
cn flag
หากใช้งานได้กับบุรุษไปรษณีย์ แต่ไม่ใช่กับ next.js นี่อาจเป็นคำถามที่ดีกว่าสำหรับ Stack Overflow ซึ่งอาจมีผู้คนคุ้นเคยกับ next.js มากกว่า
Score:0
ธง cn

ขณะนี้ฉันมีปัญหาเดียวกัน โพสต์ผ่านไปอย่างสมบูรณ์แบบในบุรุษไปรษณีย์ ข้อมูลโค้ดด้านล่างใช้เพื่อดำเนินการโพสต์ใน nextjs


// ฟังก์ชั่นนี้ใช้ในการแปลงไฟล์

const readFileDataAsBase64 = (ชั้น) => {
    ไฟล์ const = ชั้น;

    คืนสัญญาใหม่ ((แก้ไข, ปฏิเสธ) => {
        เครื่องอ่าน const = FileReader ใหม่ ();

        reader.onload = (เหตุการณ์) => {
          console.log ('ที่นี่')
            แก้ไข (event.target.result);
        };

        reader.onerror = (ผิดพลาด) => {
            ปฏิเสธ (ผิดพลาด);
        };

        reader.readAsDataURL (ไฟล์);
    });
}

// รับค่าของไฟล์ที่แปลงเป็นไบนารี
const filedata = รอ readFileDataAsBase64 (values.files [0]);

// เรียกใช้ฟังก์ชันไฟล์โพสต์เพื่อดำเนินการโพสต์
const resfile = รอ postFiles (
      'http://the-url',
      ข้อมูลไฟล์,
      ค่า.ไฟล์[0].ชื่อ
    );

const postFiles = (url, body, ชื่อไฟล์) => {

    const myPost = async() => {
        พยายาม {
         const res = รอการดึงข้อมูล (url, {
              วิธีการ: 'โพสต์',
              ร่างกาย: ร่างกาย,
              ส่วนหัว: {
                'ประเภทเนื้อหา': 'แอปพลิเคชัน/ออคเต็ตสตรีม'
                'การจัดการเนื้อหา': `file; ชื่อไฟล์=${ชื่อไฟล์}`,
                'api-key': 'myapi-คีย์'
              },
            });
        } จับ (ผิดพลาด){
        }
  
    } 
    โพสต์ข้อมูล ();
  
  };

ไฟล์นี้ไม่ถูกโพสต์ไปที่ drupalมีใครพบวิธีแก้ปัญหาในการโพสต์ไฟล์โดยใช้ API อย่างถูกต้องหรือไม่

Giuseppe avatar
br flag
สำหรับตอนนี้ฉันพบ 2 คะแนน: 1. อาจมีปัญหา CORS ดังนั้นฉันจึงต้องกำหนดค่า ดูเช่น https://www.drupal.org/node/3024331#comment-13261556 2. มีปัญหาในการเรียกระหว่าง "ส่วนหน้าถัดไป" และ "เซิร์ฟเวอร์ถัดไป" ถ้าฉันโพสต์ภาพผ่าน JS ธรรมดาหรือโดยตรงจาก "ส่วนหน้าถัดไป" มันใช้งานได้ ดังนั้นปัญหาน่าจะอยู่ที่นั่น
msd026 avatar
cn flag
ฉันแก้ไขปัญหา โพสต์ไม่ทำงานกับ fetch แต่ axios ทำงานได้ดี

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา