V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
strggle
V2EX  ›  JavaScript

js 如何使用选择上传的本地文件?

  •  
  •   strggle · 2016-05-20 00:45:39 +08:00 · 4026 次点击
    这是一个创建于 3120 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单来说,我要从本地选择一个模型文件并且在页面加载它类似这样: load(fileUrl) 但是上传文件后,在 js 中获取到的是一个本地虚拟地址,传入这个地址的话是会被浏览器拒绝访问的,我搜了一整天,没有找到能用的解决方法。 有一个方法是将文件上传到服务器后返回其地址,但是模型文件大的话大小可能有几 M 到几十 M ,这样子的话效率比较低,想问问有没有什么方法可以实现本地调用文件?

    8 条回复    2016-06-30 16:28:03 +08:00
    Slienc7
        1
    Slienc7  
       2016-05-20 00:56:14 +08:00 via Android   ❤️ 1
    rogerchen
        2
    rogerchen  
       2016-05-20 07:57:50 +08:00   ❤️ 1
    <input id="fxxk" type=file></input>
    监听一下 fxxk 的 change 事件,拿一下 ev.target.files, 送给楼上的 FileReader 就好
    strggle
        3
    strggle  
    OP
       2016-05-20 10:13:19 +08:00
    感谢楼上两位! 看了下 api ,尝试用了用 FileReader.result ,终于成功了!然后发现问题所在:
    读取数据有三个方法,只有第一个才能生效,文档里说: the result attribute contains a data: URL representing the file's data. 大意就是返回一个 URL 代表这个文件

    readAsDataURL(resultFile);
    readAsBinaryString(resultFile);
    readAsText(resultFile,'UTF-8');

    正常代码:
    var reader = new FileReader();

    reader.readAsDataURL(resultFile);

    reader.onload = function (e) {
    load(reader.result);
    }
    YuJianrong
        4
    YuJianrong  
       2016-05-20 10:50:59 +08:00
    不知道为什么不行。
    不过首先你为什么先读了再挂 onload 事件?不是应该反过来吗?
    strggle
        5
    strggle  
    OP
       2016-05-20 12:03:12 +08:00
    @YuJianrong 咦,你这么一说我才发现。这段代码是从网上教程找来修改后的 TAT ,不过实际运行还是可以跑,可能是文件比较大,还没加载完时就绑定好事件了。。。可能加载的文件小的话就会出 bug 了。。。 多谢提醒
    dsphper
        6
    dsphper  
       2016-05-20 14:00:23 +08:00
    miniwade514
        7
    miniwade514  
       2016-05-20 15:42:23 +08:00
    @YuJianrong 读文件是异步的,代码执行到 .onload 那里的时候,文件才刚开始读。.onload 只是监听 load 事件,要等文件读完了才会触发这个事件。
    fhefh
        8
    fhefh  
       2016-06-30 16:28:03 +08:00
    mark~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:59 · PVG 06:59 · LAX 14:59 · JFK 17:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.