Puncte:0

Cum se încarcă un fișier\imagine prin json api?

drapel br

Încerc să încarc un fișier sau o imagine pe un site D9 prin intermediul api json. Testul este și anume de a încărca imaginea utilizatorului pe entitatea utilizator.

Am tot urmat documentatia sau citeste intrebari despre, dar nu o pot face să funcționeze.

Front-end-ul este realizat cu Next.js.

Unul dintre testele efectuate este următorul:

Front-end-ul următor apelează serverul API next.js:

const filename = selectatFile.name;
const fr = new FileReader();
fr.readAsArrayBuffer(selectedFile);
fr.onload = funcție asincronă () {
    const arrayBuffer = fr.rezultat;
    if (arrayBuffer && typeof arrayBuffer !== „șir”) {
        const base64String = _arrayBufferToBase64(arrayBuffer);
        const cookieSession = await getUpdateCookie();
        const res = await fetch(`/api/users-test/user?cookie=${cookieSession}&name=${filename}`, {
            metoda: „POST”, corp: base64String,
        });
    }
}

funcția _arrayBufferToBase64(buffer: ArrayBuffer) {
    fie binar = '';
    const bytes = new Uint8Array(buffer);
    const len ​​= bytes.byteLength;
    pentru (fie i = 0; i < len; i++) {
        binar += String.fromCharCode(bytes[i]);
    }
    return window.btoa(binar);
}

Serverul API next.js postează apoi pe Drupal:

const res = așteaptă preluarea (
      `${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}/jsonapi/user/user/{userID}/user_picture`,
      {
        metoda: 'POST',
        antete: {
          „Content-Type”: „application/octet-stream”,
          Accept: „application/vnd.api+json”,
          'Conținut-Dispoziție': `name="fișier"; filename="${filename}"`,
          Autorizare: `Bearer ${token}`,
        },
        body: req.body,
      }
    );

Am încercat diferite moduri de a converti fișierul în „date binare de fișier”, dar niciunul nu funcționează: imaginea utilizatorului este întotdeauna un pătrat gol cu ​​un X.

Totuși, dacă încerc același apel cu poștașul, fișierul este încărcat corect:

poştaş

Deci, deocamdată, presupun că problema este pe codul javascript, în timp ce Drupal a fost configurat corect.

drapel id
Dacă există deja o întrebare, atunci nu ar trebui să o punem din nou.
Giuseppe avatar
drapel br
@cilefen din păcate, codul din acea întrebare nu a funcționat pentru mine, altfel l-aș fi avut deja să funcționeze. De exemplu, trecerea prin serverul API Next este un strat suplimentar pe care alt răspuns nu îl acoperă.
drapel cn
Dacă funcționează cu postman, dar nu și cu next.js, atunci aceasta ar putea fi o întrebare mai bună pe Stack Overflow, care probabil că are mai mulți oameni familiarizați cu next.js.
Puncte:0
drapel cn

Momentan am aceeasi problema. Postarea merge perfect în poștaș. fragmentul de cod de mai jos este folosit pentru a efectua acțiunea de post în nextjs


//Această funcție este folosită pentru a converti fișierul

const readFileDataAsBase64 = (fl) => {
    const file = fl;

    returnează o nouă promisiune((rezolvare, respingere) => {
        const reader = new FileReader();

        reader.onload = (eveniment) => {
          console.log('aici')
            rezolvare(event.target.result);
        };

        reader.onerror = (err) => {
            respinge(eră);
        };

        reader.readAsDataURL(fișier);
    });
}

//obține valoarea fișierului convertit în binar
const filedata= await readFileDataAsBase64(values.files[0]);

//apelați funcția fișier post pentru a efectua postarea
const resfile = așteaptă postFiles(
      „http://the-url”,
      date de fișier,
      valori.fişiere[0].nume
    );

const postFiles = (url, body, filename) => {

    const myPost = async() => {
        încerca {
         const res = așteaptă fetch(url, {
              metoda: 'POST',
              corp: corp,
              antete: {
                „Content-Type”: „application/octet-stream”,
                „Conținut-Dispoziție”: „fișier; filename=${filename}`,
                'api-key': 'myapi-key',
              },
            });
        } prind (err){
        }
  
    } 
    postData();
  
  };

Acest fișier nu este postat pe drupal.A găsit cineva o soluție pentru a posta corect un fișier folosind API

Giuseppe avatar
drapel br
Deocamdată, am găsit 2 puncte: 1. probabil a fost o problemă CORS, așa că a trebuit să o configurez. Vezi de ex. https://www.drupal.org/node/3024331#comment-13261556 2. Există o problemă în apelul între „următorul front-end” și „următorul server”. Dacă postez imaginea printr-un JS simplu sau direct de la „următorul front-end”, funcționează, deci problema este cel mai probabil acolo.
msd026 avatar
drapel cn
Am rezolvat problema. Postarea nu funcționa cu fetch, dar axios funcționează bine.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.