Рейтинг:0

How upload a file\image via json api?

флаг br

I'm trying to upload a file or image on a D9 site via json api. The test is namely to upload the user picture on the user entity.

I've been following the documentation or read questions about, but I can't get it working.

The front-end is done with Next.js.

One the test done is the following:

The front-end next calls the next.js api server:

const filename = selectedFile.name;
const fr = new FileReader();
fr.readAsArrayBuffer(selectedFile);
fr.onload = async function () {
    const arrayBuffer = fr.result;
    if (arrayBuffer && typeof arrayBuffer !== 'string') {
        const base64String = _arrayBufferToBase64(arrayBuffer);
        const cookieSession = await getUpdateCookie();
        const res = await fetch(`/api/users-test/user?cookie=${cookieSession}&name=${filename}`, {
            method: 'POST', body: base64String,
        });
    }
}

function _arrayBufferToBase64(buffer: ArrayBuffer) {
    let binary = '';
    const bytes = new Uint8Array(buffer);
    const len = bytes.byteLength;
    for (let i = 0; i < len; i++) {
        binary += String.fromCharCode(bytes[i]);
    }
    return window.btoa(binary);
}

The api next.js server post then to Drupal:

const res = await fetch(
      `${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}/jsonapi/user/user/{userID}/user_picture`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/octet-stream',
          Accept: 'application/vnd.api+json',
          'Content-Disposition': `name="file"; filename="${filename}"`,
          Authorization: `Bearer ${token}`,
        },
        body: req.body,
      }
    );

I tried different ways to convert the file to "binary file data", but none work: the user picture is always a blank square with an X.

However, if I try the same call with postman, the file is correctly loaded:

postman

So, for now, I hypothesize the problem is on the javascript code, while Drupal has been configured correctly.

флаг id
Если уже есть вопрос, нам не нужно задавать его снова.
Giuseppe avatar
флаг br
@cilefen, к сожалению, код в этом вопросе у меня не сработал, иначе он бы уже работал. Например, переход через апи-сервер Next — это дополнительный слой, на который не распространяется другой ответ.
флаг cn
Если это работает с почтальоном, но не с next.js, то это может быть лучший вопрос о переполнении стека, где, вероятно, больше людей знакомы с next.js.
Рейтинг:0
флаг cn

В настоящее время у меня такая же проблема. Почта проходит отлично в почтальоне. приведенный ниже фрагмент кода используется для выполнения действия публикации в nextjs.


//эта функция используется для преобразования файла

const readFileDataAsBase64 = (fl) => {
    константный файл = fl;

    вернуть новое обещание ((разрешить, отклонить) => {
        const reader = новый FileReader();

        reader.onload = (событие) => {
          console.log('здесь')
            решить (событие.цель.результат);
        };

        reader.onerror = (ошибка) => {
            отклонить (ошибка);
        };

        читатель.readAsDataURL (файл);
    });
}

//получаем значение файла, преобразованное в бинарный
const filedata = await readFileDataAsBase64 (values.files [0]);

//вызовите функцию почтового файла, чтобы выполнить публикацию
const resfile = ожидание почтовых файлов (
      'http://адрес',
      файл,
      значения.файлы[0].имя
    );

const postFiles = (url, тело, имя файла) => {

    const myPost = асинхронный () => {
        пытаться {
         const res = ожидание выборки (url, {
              метод: «ПОСТ»,
              тело: тело,
              заголовки: {
                'Content-Type': 'application/octet-stream',
                «Контент-диспозиция»: «файл; имя_файла=${имя_файла}`,
                'апи-ключ': 'мяпи-ключ',
              },
            });
        } поймать (ошибиться){
        }
  
    } 
    постданные();
  
  };

Этот файл не публикуется в drupal.Кто-нибудь нашел решение для правильной публикации файла с помощью API

Giuseppe avatar
флаг br
Пока нашел 2 точки: 1. вероятно, была проблема с CORS, поэтому мне пришлось ее настроить. См., например. https://www.drupal.org/node/3024331#comment-13261556 2. Возникла проблема в звонке между "следующим фронтендом" и "следующим сервером". Если я публикую изображение через простой JS или напрямую из «следующего интерфейса», оно работает, поэтому проблема, скорее всего, там.
msd026 avatar
флаг cn
Я решил проблему. Сообщение не работало с выборкой, но axios работает нормально.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.