Использование Dart для загрузки файла PNG (двоичного файла) и его отображение не работает

У меня есть API для отдыха, который я вызываю, чтобы получить изображение PNG для отображения на моей странице.

Мой код:

void getProfilePicture(var pic_id) {

  request = new HttpRequest();
  request.responseType = "blob";
  request.onReadyStateChange.listen(onPicture); 

  // Get Basic Auth credentials
  var authorization = 'Basic '+storage.loginData['password'];

  // Build JSON
  Map reqData = new Map();
  reqData['id'] = pic_id.toString();
  reqData['type'] = 'WEB_SMALL';

  // SEND the request to the server.
  var url = sifted.serverAPI+'/api/v1/pictures/getpicture';
  request.open('POST', url);
  request.withCredentials = false;
  request.setRequestHeader('Authorization',authorization);
  request.setRequestHeader('Content-Type','application/json');
  request.send(json.stringify(reqData));
}

void onPicture(_) {
  if (request.readyState == HttpRequest.DONE &&
      request.status == 200) {
    Blob blob = new Blob(request.response);

    FileReader reader = new FileReader();
    reader.onLoad.listen((fe) { 
      ImageElement imgInput = query('#profilepic');
      imgInput.src = reader.result;
    });
    reader.readAsDataUrl(blob); 
  }  
}

Это не работает, и я получаю эти ошибки в редакторе Dart:

Exception: type 'Blob' is not a subtype of type 'List' of 'blobParts'.
Exception: type 'Blob' is not a subtype of type 'List' of 'blobParts'.

Любые предложения о том, что я делаю неправильно?

Благодарю вас !


person Softinio    schedule 17.08.2013    source источник


Ответы (1)


Проблема в этой строке:

Blob blob = new Blob(request.response);

Конструктор Blob ожидает List вместо другого Blob (который request.response в вашем случае использования): factory Blob(List blobParts, [String type, String endings])

Просто удалите строку и напрямую вызовите reader.readAsDataUrl(request.response), и все должно работать.

person MarioP    schedule 17.08.2013
comment
Ваши предложения сработали, но теперь я хочу попытаться загрузить изображение синхронно, поэтому, когда я устанавливаю request.open('POST', url, async: false); это означает, что я не могу установить request.responseType = blob; и теперь это не работает с ошибкой: Исключение: тип «String» не является подтипом типа «Blob» из «blob». Какие-либо предложения? Спасибо - person Softinio; 21.08.2013
comment
@IncitoNetworks Да. Не используйте синхронный HttpRequest для двоичных данных. Это может быть не то, что вы хотите услышать, но если основные браузеры решат, что они не хотят поддерживать это, вы мало что можете сделать, кроме как подчиниться. Или преобразование строки в BLOB-объект, что может создать кучу других проблем. - person MarioP; 21.08.2013