дротик загрузить файл тип ввода файл

Использование Dart и Golang для небольшого приложения и попытка загрузить файл на сервер.

Нашел что-то подобное и поместил в свой файл .dart:

InputElement uploadInput = query('#file'); // my input type file

  uploadInput.on.change.add((e) {
    // read file content as dataURL
    final files = uploadInput.files;
    if (files.length == 1) {
      final file = files[0];
      final reader = new FileReader();
      reader.on.load.add((e) {
       sendDatas(reader.result);
      });
      reader.readAsDataURL(file);
    }
  });

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

Uncaught TypeError: Cannot read property 'get$on' of null 

Любая идея, как справиться с этим?

моя цель: используя тип файла ввода, загрузить файл на сервер (размер файла ‹ 1 МБ)


person bboy    schedule 29.08.2014    source источник
comment
Чего вы пытаетесь достичь в любом случае? Возможно, вы ищете stackoverflow.com/questions/13673030.   -  person Günter Zöchbauer    schedule 29.08.2014
comment
у меня просто есть файл типа ввода, и я хочу добавить файл и опубликовать его на сервере.   -  person bboy    schedule 29.08.2014


Ответы (2)


Этот синтаксис изменился около года назад.

попробуйте вместо этого

uploadInput.onChange.listen((e) {

такое же изменение необходимо здесь

reader.onLoad.listen((e) {

синтаксис xxx.on... предназначен только для пользовательских событий или событий браузера, где у Dart еще нет прямых геттеров.

Это также работает для стандартных событий браузера. Вы можете использовать его как

uploadInput.on['change'].listen((e) => doSomething());
person Günter Zöchbauer    schedule 29.08.2014
comment
привет мужик, спасибо за ответ. теперь я получаю что-то вроде этого: Uncaught TypeError: Cannot read property 'get$onChange' of null - person bboy; 29.08.2014
comment
Не могли бы вы проверить, имеет ли значение uploadInput перед выполнением этой строки? - person Günter Zöchbauer; 29.08.2014
comment
это не так. о, это нужно @observable uploadInput = 0 ? - person bboy; 29.08.2014
comment
Я пропустил это. Вы должны использовать querySelector вместо query (но query тоже должно работать, я думаю, но он помечен @deprecated около года, и я никогда не пробовал). Вы пользуетесь полимером? @observable обычно используется в полимерных элементах. Его можно использовать и отдельно, но ваш код ничего не указывает в этом направлении. Проверьте, имеет ли ваш элемент ввода идентификатор file. - person Günter Zöchbauer; 29.08.2014
comment
Я не знаю, что вы подразумеваете под «мой ввод имеет #file». Элемент ввода должен выглядеть как <input type="file" id="file">. id="file" — важная часть, чтобы заставить его работать с querySelector('#file');. Вы также можете использовать querySelector('input[type=file]');, тогда атрибут id не нужен. Вы можете использовать селекторы CSS с querySelector() (см. w3.org/TR/CSS2/selector.html ) - person Günter Zöchbauer; 29.08.2014
comment
Когда вы используете полимер, вы можете сделать привязку в HTML <input type="file" on-change="{{fileChangeHandler}}"> и в Dart void fileChangeHandler(Event e) { doSomething(); } вместо querySelector` и uploadInput.onChange.listen - person Günter Zöchbauer; 29.08.2014

Наконец-то изменили код и это последняя работающая функция, загружающая файл с помощью DART:

updatefileToPlay(Event e, dynamic data, FileUploadInputElement el) {

    final files = el.files;
        if (files.length == 1) {
          final file = files[0];
          final reader = new FileReader();

          reader.onLoad.listen((e) {

            FormData data = new FormData(); // from dart:html
                data.append("file", file);

                HttpRequest.request('/upload?id='+message.id, method: 'POST', sendData: data).then((HttpRequest r) {
                  if (r.readyState == HttpRequest.DONE &&
                      (r.status == 200 || r.status == 0)) {
                    window.alert("upload complete");
                  }
                });
          });
          reader.readAsDataUrl(file);
        }
  }
person bboy    schedule 16.09.2014