我正在用scala.js编写一个chrome应用程序,并且有一些文件读取问题。
当我使用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 :(得分: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
}
}