Javascript 无法将文件分配给文件输入、Firefox和IE

Javascript 无法将文件分配给文件输入、Firefox和IE,javascript,Javascript,用户可以通过两种可能的方式启动文件传输:拖放到小部件,或使用多文件输入按钮。我喜欢使用多文件输入,它将用智能的“选择8个文件”或其他什么来替换文件名字符串 要获得此信息,必须填充输入。我不想从drop事件实际生成xhr2对象,而是想将其文件列表传递到input元素,并通过input的“change”事件触发xhr2 下面是一些框架代码(jQuery用于事件绑定,但addListener也应如此): 我知道文件列表对象本身是只读的,我怀疑Chrome的设计是为了说“是的,该文件列表没有被篡改,让我

用户可以通过两种可能的方式启动文件传输:拖放到小部件,或使用多文件输入按钮。我喜欢使用多文件输入,它将用智能的“选择8个文件”或其他什么来替换文件名字符串

要获得此信息,必须填充输入。我不想从drop事件实际生成xhr2对象,而是想将其文件列表传递到input元素,并通过input的“change”事件触发xhr2

下面是一些框架代码(jQuery用于事件绑定,但addListener也应如此):

我知道文件列表对象本身是只读的,我怀疑Chrome的设计是为了说“是的,该文件列表没有被篡改,让我们允许吧”,Firefox的设计是为了说“哇,总线。你想用某个对象更新我可爱的安全文件输入吗?我不知道那个臭烘烘的对象从哪里来,否认!”

因此,问题有两个:

  • 我的上述假设正确吗?这就是我不能使输入的“files”属性等于fileList的原因吗

  • 是否有更新输入文件属性的替代方法(而不仅仅是尝试向属性添加值)?能够并行更新多个文件输入节点很好


  • 出于安全原因,浏览器在文件上传/文件访问方面非常挑剔。似乎您正试图将文件从一个
    复制到另一个
    ;你不能那样做。与其这样做,不如像大多数文件上传插件那样做。隐藏真正的
    元素,只需在
    或任何东西中显示所选的
    8个文件。这就是我害怕的,Rocket.)浏览器知道用户发起了事件;通过不允许文件列表本身被篡改来采取安全措施;Chrome似乎理解这一点,而Firefox/IE只是看到一个传入对象并阻止它。显然,我认为Chrome做得很好,而且我所知道的模型中没有安全漏洞!好吧,我想唯一的问题是如果你能创建你自己的
    文件列表
    对象。我想Chrome(和IE/Firefox)会阻止它。当然。但是,既然浏览器应该知道人工启动的输入,那我就明白了。;-)谢谢你看,火箭。我想我会伪造文件数量的!这只是我能想到的第一个解决方法,因为复制
    文件
    对象显然不是跨浏览器的:)
    
    domNode.defaultUI.on("drop", "#progOver", function(evt) {
      evt.preventDefault();
      evt.stopPropagation();
      function sendFiles() {
        var fileList = evt.originalEvent.dataTransfer.files;
        document.getElementById('files-upload').files = fileList;
      }
      if (someCondition) {
        sendFiles();
      }
    });
    
    domNode.defaultUI.on("change", '#files-upload', function(evt) {
      console.log(evt.target.files);  // fileList object in Chrome, empty (prototype) fileLIst in Firefox
    });