我可以使用JavaScript / JQuery将上传的文件添加到ASP.NET中的Request.Files吗?

我不完全确定如何使用JavaScript将文件添加到Request.Files中? 这就是我想要的……

var x = $('input[type=file]:eq(0)'); //Add the data to the hidden field hiddenField.val(x.val()); //Add the html display fileDisplayDiv.innerHTML += "display name"; //Add this file to request.files How to do??? //Clear the input so the user may add more files before postback. x.val(""); 

输入是常规HTML输入。 是的,最终我正在尝试开发一个多文件上传(这就是我清除输入字段的原因) – 我看了第三方的东西,但我需要自定义function来处理我正在做的事情。 我认为这个任务似乎应该是可能的,否则ajax上传器将如何工作?

任何帮助表示感谢,提前谢谢。

我将提供一个我倾向于使用的HTML5之前的方法。 这有一些缺点,但有许多优点 – 主要是它几乎完全是跨浏览器(唯一的要求是JavaScript和隐藏的IFRAME)。

我会立即列出这些缺点,以便您确切知道可能遇到的问题:

  • 如果您要发布到其他域,您将无法从中获得回报
  • 除了内容之外,您无法获得任何内容,HTTP错误将导致它无声地失败。
  • 如果失败,您将不得不重新生成表单。 如果发生这种情况,您无法自动为用户重新选择文件。

解决方案:将您的输入类型=“文件”放在友好的IFRAME中并使用此提交。 它不是AJAX,它是一种非常古老的方法,但它有效。

如何

步骤1.创建一个IFRAME并为其提供一个ID或类,以便能够有效地选择它。 在DOMReady上创建它而不是混乱预先准备好的东西。 在创建它时,使用$('#yourIframe').load(function() { });为其分配一个load事件$('#yourIframe').load(function() { }); 。 触发后,您就会知道现在可以向iframe添加内容了。 诀窍是将所有表单元素复制到它,并留下“克隆” – 并将所有有用的事件绑定到IFRAME中的那些。 为了:

  • click()change()输入type =“file”,输入type =“text”并选择
  • change()其他任何事情

click事件应该简单地转发到IFRAME中的元素。 change()事件绑定到IFRAME中的元素时,允许您恢复文件的名称。

单击幻像提交按钮时,让它将load()事件绑定到IFRAME,然后在IFRAME中提交表单。 提交表单后,您将能够使用$(“body”,$(this).contents())访问加载处理程序内的iframe内容。

我写了一个小小提琴来说明: http : //jsfiddle.net/WQhnM/2/ 。 请记住,JSFiddle.net将获取数据(所以不要发送任何太严重/有罪的;-))并且他们的服务器拒绝大于100kb的任何东西(所以发送一些小的东西)。 不过,这个想法就在那里。 我已经让IFRAME可见,所以你可以看到会发生什么。

到目前为止,这不是一个漂亮的解决方案,但它可以工作,直到IE赶上HTML5。

编辑 :我忘了提 – 这需要一个黑客在IE7中工作。 在此特定浏览器中未正确触发change() 。 解决方案:

 if (!$.browser.msie) { nItem.change(function() { ... }); } else { nItem.click(function() { setTimeout(function() { (function() { ... }); },0); }); } 

您需要支持旧浏览器吗?

传统上,没有办法使用纯javascript / ajax上传文件。 出于安全原因,javascript访问控件受到限制(否则您可能会欺骗浏览器上传用户计算机上的任何文件)。 第三方上传控件使用flash来解决这些限制,如果需要支持旧浏览器,这仍然是唯一真正的解决方案。

HTML5提供了两项新function,可以帮助您实现您的目标:

  • 文件API :允许您本地执行许多很酷的操作,例如选择多个文件,列出所选文件以及显示文件信息(所有客户端)。
  • 使用AJAX上传文件 。 您现在可以使用XMLHttpRequest对象将文件或任何blob数据发送回服务器。

我还没有尝试过后者,但我相信你应该能够使用ASP.NET的Request.Files[]对象访问上传的文件(如果你尝试的话,请告诉我们!)。 这些function并非普遍支持,最重要的是IE 8/9缺乏对上述大多数function的支持。 因此,如果您需要支持这些浏览器,最好的选择是使用第三方上传控件之一。