2015-02-22 3 views
0

Я пишу хром-приложение с scala.js и имею некоторые проблемы с чтением файлов.TypeError: Не удалось выполнить 'readAsText' в 'FileReader': параметр 1 не относится к типу 'Blob'

Когда я использую chrome.fileSystem.chooseEntry с openDirectory для выбора каталога, я хочу, чтобы прочитать файл _meta_.json внутри, код:

chrome.fileSystem.chooseEntry(js.Dynamic.literal("type" -> "openDirectory"), (dir: Entry) => { 
    dir.getFile("_meta_.json", js.Dynamic.literal(), (entry: FileEntry) => { 
     entry.file((file: FileEntry) => { 
      val reader = new FileReader() 
      reader.onload = (event: UIEvent) => { 
      println("############ read file: " + event) 
      } 
      reader.onloadend = (event: ProgressEvent) => { 
      println("############ read file: " + reader.result) 
      () 
      } 
      reader.onerror = (event: Event) => { 
      println("######### read error") 
      () 
      } 

      println("###### going to read") 
      reader.readAsText(entry.asInstanceOf[Blob]) // !!!! 
     () 
     }) 
    }) 
}) 

(код здесь упрощается, если вы хотите, чтобы увидеть точный код , см. https://github.com/freewind/fast-links/blob/master/src/main/scala/in/freewind/fastlinks/chrome_app/config/Header.scala#L45)

Но когда код запущен, он ничего не печатает, кажется, что файл никогда не читается. Тогда я поставил отладчик и вошел в линию заканчивается // !!!! и запустить код в консоли:

reader.readAsText(this.entry$1$2) 

Он сообщает об ошибке:

TypeError: Failed to execute 'readAsText' on 'FileReader': parameter 1 is not of type 'Blob'. 

Это ясно показывает причину, но я не знаете, как это исправить. Я искал, но все аналогичные примеры используют файл ввода файла из html DOM.

Как читать файл правильно?

+0

Просто нашел причину, это глупая ошибка. Это должно быть 'reader.readAsText (file.asInstanceOf [Blob])', а не 'entry.asInstanceOf [Blob]'! – Freewind

ответ

0

я столкнулся с чем-то подобным и нашел этот ответ: Problems with HTML5 FileReader

TLDR: Параметр, который вы передаете читателя файла это имя файла (строка), а не сам файл объекта.

попробовать что-то вроде этого:

loadFile: function(e) { 
    if(e != undefined) { 
     var file = e.target.files[0]; 
     if(file != null && file.size > 0) { 
      reader.readAsText(this.entry$1$2); 
      //process file 
     } else { 
      //error 
     } 
    } 
Смежные вопросы