Всем привет.
Хочу с сервера (на .net core 3.1) отправить изображение, обычное jpg, через SignalR. Получить его в браузере, в проекте ангуляра и отобразить на страничке.
Обычный текстовый чатик у меня работает.
Что я делаю с изображением:
1. На сервере делаю рассылку изображения всем (не заморачиваясь) клиентам, изображение в формате массива байтов:
byte[] file = await File.ReadAllBytesAsync(@"C:\Avatars\user7.jpg");
await Clients.All.BroadCastImage(file);
Файл существует, в переменной file появляется какой-то реальный массив байтов.
2. Подписываюсь на эту рассылку на клиенте в ангуляре:
// стандартные подключения
public initConnection() {
this.connection = new signalR.HubConnectionBuilder()
.withUrl('/chat')
.build();
}
public connectionWebSocket() {
this.connection.start();
this.connection.on("BroadCastImage", image => {
var blob = new Blob([image], { type: "image/jpeg" });
var reader = new FileReader();
reader.readAsDataURL(blob);
var that = this;
reader.onloadend = function () {
that.base64data = that.sanitizer.bypassSecurityTrustUrl(reader.result + '');
}
});
}
Работа через FileReader взята со стаковерфлоу, но так же наткнулся на аналогичное описание в
учебнике. Так же в процессе изысканий наткнулся на то, что ангуляр может некорректно обрабатывать формируемые url, добавил зависимость в конструктор:
private sanitizer: DomSanitizer
3. Далее эту переменную просто вставляю в html в тег img
<img [src]="base64data"/>
4. После отправки изображения с сервера, на клиенте отображается битая картинка. В её src лежит что-то, похожее на правду. Но дальше я не знаю, как это отлаживать