Angular 5: как сохранить пользователя с аватаром BLOB

Я новичок в Angular и хочу сохранить нового пользователя с аватаром, так как я могу передать значение Blob аватара моей модели пользователя, чтобы я мог правильно его сохранить?

Это мой код:

HTML

<input type = "file" (change) = "onSelectFile($event)" accept = "image/x-png,image/gif,image/jpeg" value = "{{image}}" id = "avatar" ngModel name = "avatar" #avatar = "ngModel"/>

Машинопись

image:any;

onSelectFile(event) {
  var reader ;
  reader = new FileReader;
  reader.onload = (event) => {
    console.info(reader.result);
    this.image = reader.result;
    console.info(this.image);
  }
  reader.readAsDataURL(event.target.files[0]);
}

Ошибка, которую я получаю при сохранении пользователя:

{"timestamp":"2018-11-24T13:29:13.222+0000","status":400,"error":"Bad Request","message":"JSON parse error: Cannot deserialize value of type `byte[]` from String \"\\fakepath\\IMG_20180808_023905.jpg\": Failed to decode VALUE_STRING as base64 (MIME-NO-LINEFEEDS): Illegal character ':' (code 0x3a) in base64 content; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `byte[]` from String \"\\fakepath\\IMG_20180808_023905.jpg\": Failed to decode VALUE_STRING as base64 (MIME-NO-LINEFEEDS): Illegal character ':' (code 0x3a) in base64 content\n at [Source: (PushbackInputStream); line: 1, column: 134] (through reference chain: org.vi.entities.User[\"avatar\"])","path":"/users"}

PS: тип поля аватара в пользовательской таблице - longblob

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
725
2

Ответы 2

onSelectFile(event) {
    let reader = new FileReader;
    reader.onload = this.handle.bind(this); 
    reader.readAsArrayBuffer(this.file);
}

handle(readerEvt: any) {

   let bytes = new Uint8Array(readerEvt.target.result);
   for (let index = 0; index < bytes.byteLength; index++) {
       this.image += String.fromCharCode(bytes[index]);
    }
 }

Лучше записывать изображения в виде текста в базе данных и отправлять строку base64 на сервер. Тогда ваша функция должна выглядеть так:

handle(readerEvt: any) {

   let bytes = new Uint8Array(readerEvt.target.result);
   let binaryText = ''; 
   for (let index = 0; index < bytes.byteLength; index++) {
       let binaryText += String.fromCharCode(bytes[index]);
    }
   this.image = btoa(binaryText);
 }

это не лучшая практика в случае больших файлов. для больших файлов размещать файлы на сервере, используя данные формы

Michael 24.11.2018 16:13

Я не рекомендую вам сохранять изображения как капли в базе данных, лучше сохранить только имя аватара и получить изображение, которое будет отображаться после.

Если вам интересно попробовать это, я думаю, что этот учебник подходит для этого.

Другие вопросы по теме