Ошибка проверки при вызове API с файлами - PullRequest
0 голосов
/ 03 сентября 2018

Я использую реагирование, избыточность для бэкенда и jsx для проекта, который требует взять файл изображения в качестве ввода от пользователя и отправить его в некоторый API для загрузки. Вот мой код:

функция post (запрос) {

let config = request.server.app.config;
if (!imageEditClient) {
    imageEditClient = new HttpClient('imageEditClient', {
        timeout: 5000,
        connectionTimeout: 5000,
        baseUrl: `${config.get('api.baseUrl')}`
    });
}

request.log(['UploadImage payload coming from request'], request.payload);

let payload = request.payload;
let suffix = 'ImageUpload';
// let blob = new Blob([request.params.imageFile], {type: 'image/jpeg'});

let form = new FormData({maxDataSize: 20971520});

    let form = new FormData({maxDataSize: 20971520});

    const options = {
        payload,
        headers: {
            'If-Match': '*',
            'Content-Type': undefined

        }
    };

    form.append('file', request.params.imageFile);
    form.append('json', request.params.dataFile);

    return imageEditClient.post(suffix, options, form).then(mutate)
        .catch((err) => {
            err.message = `ImageEditService: ${err.message} - ${suffix}.`;
            throw err;
        });

}

Я получаю следующую ошибку:

[1] "value" must be a Function
[HAPIJS]     at Object.exports.process (/Users/alnc/ha_projects/content-catalog-node-ui/node_modules/joi/lib/errors.js:181:19)
[HAPIJS]     at iterate (/Users/alnc/ha_projects/content-catalog-node-ui/node_modules/items/lib/index.js:36:13)
[HAPIJS] [2018-09-03 09:20:51,836](53611) [log] [warn] - shutting down.
[HAPIJS] Debug: internal, implementation, error 
[HAPIJS]     ValidationError: Uncaught error: {
[HAPIJS]   "_overheadLength": 206,
[HAPIJS]   "_valueLength": 26,
[HAPIJS]   "_valuesToMeasure": [],
[HAPIJS]   "writable": false,
[HAPIJS]   "readable": true,
[HAPIJS]   "dataSize": 0,
[HAPIJS]   "maxDataSize": 20971520,
[HAPIJS]   "pauseStreams": true,
[HAPIJS]   "_released": false,
[HAPIJS]   "_streams": [
[HAPIJS]     "----------------------------703740497184449347716405\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n",
[HAPIJS]     "[object Blob]",
[HAPIJS]     function () { [native code] },
[HAPIJS]     "----------------------------703740497184449347716405\r\nContent-Disposition: form-data; name=\"json\"\r\n\r\n",
[HAPIJS]     "[object Blob]",
[HAPIJS]     function () { [native code] }
[HAPIJS]   ],
[HAPIJS]   "_currentStream": null,
[HAPIJS]   "_boundary": "--------------------------703740497184449347716405",
[HAPIJS]   "value" [1]: -- missing --
[HAPIJS] }

Ошибка мне не ясна. Есть идеи?

1 Ответ

0 голосов
/ 03 сентября 2018

вы не можете использовать данные формы для такой реакции, сначала вы должны обработать ваш imageFile и сделать объект e Blob из запрошенного изображения, а затем отправить объект blob изображения, который вы только что создали, в объект данных формы (добавить этот Blob к свойству «file» данных формы вместо непосредственного добавления изображения запроса) эти функции могут помочь вам выполнить преобразование в BLOB-объекты для ваших изображений:

      function dataURLtoBlob(dataURL) {
        const binary = atob(dataURL.split(',')[1]);
        const array = [];
        const length = binary.length;
        let i;
        for (i = 0; i < length; i++) {
          array.push(binary.charCodeAt(i));
        }
        return new Blob([new Uint8Array(array)]);
      }

следующие две функции - создать изображение из вашего введенного изображения и получить для него dataUrl из программы чтения файлов, чтобы использовать его в вышеуказанной функции для преобразования в BLOB-процесс. Первая функция - это основная функция, которая вызывается с того места, где вы вводите изображение от пользователя:

      export function processFile(file) {
        return new Promise((resolve, reject) => {
          try {
            const reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onloadend = async function() {
              const processedFile = await handleImage(reader.result);
              resolve(processedFile);
            };
          } catch (err) {
            reject(err);
          }
        });
      }

тогда:

      async function handleImage(dataURL) {
        const image = new Image();
        image.src = dataURL;
        return new Promise((resolve, reject) => {
          image.onload = function() {
              resolve(dataURLtoBlob(dataURL, fileType));
          };
          image.onerror = reject;
        });
      }

для остальной части вашего кода, если вы получаете изображения из ввода, вы можете использовать event.target.files [0] из события, прикрепленного к вашему входному изменению файла, чтобы отправить его как переменную файла в функции processFile выше, а затем добавьте его к данным вашей формы: первый:

  imageData = await processFile(fileData);

, а затем из вашего кода данных формы:

  form.append('file', imageData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...