在Firefox中访问FileReader的部分结果

尤文

我想FileReader在Web应用程序中使用来将CSV文件部分加载到浏览器中。但是,我无法在Firefox 27中访问部分结果

我的应用程序仅需要CSV文件的前100k字节来填充数据预览。因此,abort在装入一定数量的数据后,我先设置,启动,然后再启动读取器。

这是一个在Chrome 35中可以正常运行的示例:

  warn = (a...) -> console.warn a...
  readFile = (file,cb,limit=1e5) ->
    warn "start reading file..."
    fr = new FileReader
    result = null
    done = -> cb null,result[..limit]
    copy = (e) ->
      if e.target.result? then result = e.target.result; warn "copied #{result.length} bytes"
      else warn "result is empty"
    fr.onloadstart = (e) -> warn "Reading #{file.name} locally..."
    fr.onloadend   = (e) -> warn "Reading finished (end)";   copy(e); done()
    fr.onabort     = (e) -> warn "Reading finished (abort)"; copy(e)
    fr.onload      = (e) -> warn "Reading finished (load)";  copy(e)
    fr.onprogress  = (e) ->
      warn "progress.."; copy(e)
      if e.loaded > limit
        warn "Read #{e.loaded} bytes of CSV file for data preview. Aborting FileReader."
        fr.abort(); fr.onprogress = null
    fr.readAsText file

但是,该代码在Firefox中不起作用。中止阅读器时,所有复制的结果均为空。即使该事件表明已正确设置了某些数据并已按预期触发了该事件,也没有其他事件会e携带e.target.resultnullprogresse.loadedabort()

显然,Chrome和Firefox似乎以不同的方式实现File API,即,以abort()不同的方式处理在Firefox中,您始终必须完全加载文件才能获得任何结果。对我来说,这是不合适的,因为我的CSV文件具有200MB或更多字节的数据,在必须完全加载数据时,我的浏览器处于冻结状态。

PS:我只关心Chrome和FF。IE和移动不在此项目范围内

编辑:这是在Chrome和Firefox中很好用的最终解决方案:

  readFile = (file,cb,limit=1e4) ->
    warn "start reading file..."
    fr = new FileReader
    done = (e) ->
      warn "Read #{e.loaded} of #{file.size} bytes of CSV file for data preview"
      cb null,fr.result
    fr.onloadstart = (e) -> warn "Reading #{file.name} locally..."
    fr.onload      = (e) -> warn "Reading finished (load)"; done(e)
    fr.readAsText file.slice 0,limit
nmaier

Chrome违反了当前的规范草案,该草案规定abort()

如果readyState = LOADING,则将readyState设置为DONE,并将结果设置为null来源,重点是我的)

现在,您可以争论这是好事还是坏事...

最好只读取文件的一部分的最佳方法是.slice()先将文件/ Blob对象传递给阅读器,然后告诉浏览器只读取文件的一部分:

fr.readAsText(file.slice(0, limit));

当然,在处理诸如UTF-8之类的多字节编码时,您可能不得不处理问题。但是,无论如何,即使是纯Chrome的abort()东西,您也都必须处理

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 JavaScript 中为动态文件输入获取 FileReader 结果

来自分类Dev

角度8,上传(使用后期多部分/表单数据)FileReader.readAsDataURL的结果

来自分类Dev

获取FileReader()的结果对象

来自分类Dev

访问报告中的结果摘要

来自分类Dev

从外部访问函数内部分配的数组-意外结果

来自分类Dev

FileReader加载结果和参数

来自分类Dev

Javascript函数结果未在Firefox中显示

来自分类Dev

访问位置无关代码中的.data部分

来自分类Dev

在熊猫中快速访问部分行

来自分类Dev

Firestore部分中的访问方法-Vuefire

来自分类Dev

在熊猫中快速访问部分行

来自分类Dev

在Module.php中访问部分

来自分类Dev

访问位置无关代码中的.data部分

来自分类Dev

在Stata中,如何访问混合命令的结果?

来自分类Dev

访问wilcox_test结果中的插槽

来自分类Dev

在Stata中,如何访问混合命令的结果?

来自分类Dev

在JavaScript中访问MySQL COUNT(*)结果对象

来自分类Dev

尝试访问php中的json结果

来自分类Dev

在链式调用中访问结果数组的大小

来自分类Dev

如何访问硒中的javascript结果

来自分类Dev

访问e剂中的中间结果

来自分类Dev

在Stata中,如何访问混合命令的结果?

来自分类Dev

在wilcox_test结果中访问插槽

来自分类Dev

有没有办法使用JavaScript中的FileReader获取文件的特定部分?

来自分类Dev

在Convert.FromBase64String中输入FileReader.readAsDataURL结果返回格式异常

来自分类Dev

在Firefox for Android插件中访问DOM

来自分类Dev

访问iframe内容(在firefox插件javascript中)

来自分类Dev

如何在Firefox中访问被阻止的网站?

来自分类Dev

Selenium Python无法在Firefox中访问站点

Related 相关文章

热门标签

归档