Я новичок в 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






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);
}
Я не рекомендую вам сохранять изображения как капли в базе данных, лучше сохранить только имя аватара и получить изображение, которое будет отображаться после.
Если вам интересно попробовать это, я думаю, что этот учебник подходит для этого.
это не лучшая практика в случае больших файлов. для больших файлов размещать файлы на сервере, используя данные формы