V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuxu
V2EX  ›  程序员

我本是征服了大海的男人,却摔死在 javascript 这片沙滩上

  •  
  •   liuxu · 2015-07-09 18:46:54 +08:00 · 3540 次点击
    这是一个创建于 3417 天前的主题,其中的信息可能已经有所发展或是发生改变。
    又在这美丽的夕阳下加班。
    昨天室友面试遇到一个刁钻的JAVA题目,回来我用C重写,用gdb反汇编后用AT&T汇编代码和他讲解了程序的原理,为什么答案会是那样,讲完后我都觉得这个世界上没有我解决不了的问题。可是今天用javascript发送个post请求到一个php接口上,我倒下了,情况是这样的。。。
    我有一个' <input type="file" id="myfile" /> '标签,点击上传文件后,需要post提交给我的a.php这个接口文件。我不能直接提交,必须用js动态生成一个form表单,然后把这个myfile的文件读到我动态生成的表单,然后提交到a.php。,第一种方法,我用 ' createElement("form") '这种方式,现在问题来了,新生成的' <input type="file" /> '里必须有一个' name="hhh" '属性,用这种方式我可以用' document.getElementById("myfile").files[0] '得到文件对象,可是却不知道怎么把得到的文件对象设置给动态生成的 ' <input type="file" /> '标签里。
    第二种方法用ajax,用' var myfrm=new FormData() '生成表单,这种方式添加file标签,' myfrm.append("file",document.getElementById("myfile").files[0]); ',可是不知道怎么给它设置name属性,,更让我尴尬的是,我使用的ubuntu 14.04,浏览器是chrome 43.0.2357.130 (64-bit),文件在/home/liuxu/download/ 下,用alert输出input的value值却是“C:\fakepath\GDB调试入门教程.pdf”。。。
    在这北京的天空之下,我都觉得我的夜晚连星星都不再亮了, 苦海无涯,回头无岸,,盼望着没有哪位js大神指点我一二,给我力量,让我披荆斩棘,不再被任何bug阻拦。
    谢谢。
    26 条回复    2015-07-10 17:10:49 +08:00
    yxzblue
        1
    yxzblue  
       2015-07-09 18:52:54 +08:00
    gdb反汇编后用AT&T汇编代码是什么意思?
    tabris17
        2
    tabris17  
       2015-07-09 18:55:40 +08:00
    @yxzblue AT&T ASM是一种汇编的格式,和INTEL ASM有所区别
    zhengnanlee
        3
    zhengnanlee  
       2015-07-09 18:56:57 +08:00 via Android
    同问反汇编。。这是为了炫耀?
    DualWield
        4
    DualWield  
       2015-07-09 19:03:35 +08:00   ❤️ 1
    jquery.form.js ,具体实现请看源码
    RIcter
        5
    RIcter  
       2015-07-09 19:04:42 +08:00
    我感觉还是 intel 格式的汇编好看(
    liuzhen
        6
    liuzhen  
       2015-07-09 19:05:00 +08:00
    第一步为什么要动态生成form呢?直接把form写页面上, input file写在form里面不行吗
    jsq2627
        7
    jsq2627  
       2015-07-09 19:06:02 +08:00   ❤️ 2
    C:\fakepath 这个是浏览器为了安全,不允许JS读到文件的实际路径,所以就提供了一个虚拟路径来替代。
    epicq
        8
    epicq  
       2015-07-09 19:07:43 +08:00
    刚好看CSAPP看到了反汇编
    sumhat
        9
    sumhat  
       2015-07-09 19:08:32 +08:00
    Javascript: 怪我喽?
    liuxu
        10
    liuxu  
    OP
       2015-07-09 19:17:48 +08:00
    @zhengnanlee 是为了装(),每次装完我都有深深的快感
    liuxu
        11
    liuxu  
    OP
       2015-07-09 19:18:50 +08:00
    @liuzhen 问题就在这里,工作情况是不能动已有的页面代码,只能写js
    liuxu
        12
    liuxu  
    OP
       2015-07-09 19:19:07 +08:00
    @jsq2627 原来是这样,感谢
    echo1937
        13
    echo1937  
       2015-07-09 19:19:33 +08:00   ❤️ 1
    @liuxu 装()会上瘾,进而导致快感获取障碍综合症。
    nocwat
        14
    nocwat  
       2015-07-09 19:23:09 +08:00
    myfrm.append("file",document.getElementById("myfile").files[0]);
    第一个参数 "file" 不就是 name 么?

    value 不对是正常的,现在的浏览器都这么干了
    18000rpm
        15
    18000rpm  
       2015-07-09 19:36:15 +08:00 via Android
    从海里来的乡巴佬,欢迎来到陆地。
    <删除线>装完逼就跑!去学汇编了哈哈</删除线>
    liuxu
        16
    liuxu  
    OP
       2015-07-09 19:44:06 +08:00
    @echo1937 有肾宝,我好,大家都好。
    zhengnanlee
        17
    zhengnanlee  
       2015-07-09 19:45:42 +08:00
    @liuxu 果然。。
    liuxu
        18
    liuxu  
    OP
       2015-07-09 19:47:23 +08:00
    @nocwat 我试过,没有用。。
    liuxu
        19
    liuxu  
    OP
       2015-07-09 19:48:40 +08:00
    @18000rpm 装完逼还想跑,我的大刀早已饥渴难耐
    god
        20
    god  
       2015-07-09 20:02:30 +08:00 via iPad
    欢迎进入新世界。。
    chagel
        21
    chagel  
       2015-07-09 20:06:04 +08:00   ❤️ 1
    file input的value因为安全原因不能随意设,可以试试把老的input整个deep copy到新的form里(比如,参考jquery的clone方法)
    liuzhen
        22
    liuzhen  
       2015-07-09 20:45:40 +08:00
    @liuxu 那么你还可以尝试FileReader (不考虑兼容IE) 参考http://blog.csdn.net/oscar999/article/details/37499743
    sampeng
        23
    sampeng  
       2015-07-10 11:46:30 +08:00
    前面一截是纯炫耀么。。。。
    otakustay
        24
    otakustay  
       2015-07-10 14:22:59 +08:00   ❤️ 1
    第一个问题,input比较特殊,你很难用createElement创建,所以你最好的办法就是写innerHTML
    第二个问题,input[file]的value是一个假的,这是防止XSS的浏览器安全控制

    总之这个问题最好的解决办法就是用innerHTML写form出来
    nine
        25
    nine  
       2015-07-10 15:14:31 +08:00
    欢迎使用$.post
    dotudeth
        26
    dotudeth  
       2015-07-10 17:10:49 +08:00
    查一下 new formdate
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1896 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.