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

我可以使用JavaScript/JQuery将上传的文件添加到ASP.NET中的Request.Files吗?,javascript,jquery,asp.net,request,Javascript,Jquery,Asp.net,Request,我不完全确定如何使用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 += "<a href='#' class='filename'>display name<

我不完全确定如何使用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 += "<a href='#' class='filename'>display name</a>";

//Add this file to request.files
How to do???

//Clear the input so the user may add more files before postback.
x.val("");
该输入是常规HTML输入。是的,最终我试图开发一个多文件上传这就是为什么我要清除输入字段-我看了第三方的东西,但我需要自定义功能为我所做的。我认为这项任务应该是可能的,否则ajax上传程序将如何工作


感谢您的帮助。您需要支持旧浏览器吗

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

HTML5提供了两个新功能,可以帮助您实现您的目标:

:允许您以本机方式执行许多很酷的操作,例如选择多个文件、列出所选文件以及在所有客户端显示文件信息。 . 现在,您可以纯粹使用XMLHttpRequest对象将文件或任何blob数据发送回服务器。
我自己还没有尝试过后者,但我相信您应该能够使用ASP.NET的请求访问上载的文件。文件[]对象如果您尝试,请告诉我们!。这些功能并没有得到普遍支持,最重要的是IE8/9缺乏对上述大部分功能的支持。因此,如果您需要支持这些浏览器,最好使用第三方上传控件。

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

我将立即列出缺点,以便您确切了解可能遇到的问题:

如果您正在发布到另一个域,您将无法从该域获得回报 除了从中获取内容之外,您无法从中获取任何内容,HTTP错误将导致它以静默方式失败。 如果失败,您必须重新生成表单。如果发生这种情况,则无法自动为用户重新选择文件。 解决方案:将您的输入类型=文件放在友好的IFRAME中,并使用它提交。这不是AJAX,它是一种非常古老的方法,但它可以工作

如何

第一步。创建一个IFRAME并给它一个ID或类,以便能够有效地选择它。在DOMReady上创建它,而不是把预先准备好的东西弄得乱七八糟。创建它时,使用$'yourIframe'.loadfunction{};为它分配一个加载事件。当触发时,您将知道现在可以向iframe添加内容。 诀窍是将所有表单元素复制到其中,留下克隆,并将所有有用的事件绑定到IFRAME中的事件。为了:

单击并更改输入类型=文件,输入类型=文本,然后选择 换别的吗 单击事件应该简单地转发到IFRAME中的元素。当绑定到IFRAME中的元素时,change事件允许您恢复文件名

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

我写了一个小提琴来说明:。请记住,JSFiddle.net将获取数据,因此不要发送任何太严重/牵连的信息;-他们的服务器拒绝任何大于100kb的数据,所以发送一些小数据。不过,想法就在那里。我让IFRAME可见,以便您可以看到发生了什么

到目前为止,这还不是一个很好的解决方案,但在IE赶上HTML5之前,它是有效的

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

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

您是想通过回发还是ajax来实现这一点?我希望用户能够单击动态文件上传程序,并添加任意数量的文件-这部分应该是客户端的。稍后,在回发时,我想从Request.files检索这些文件。我希望这种情况只发生在一个htmlfileinput上,但是到目前为止,我只能从htmlfileinput中获取最新的文件,而不是它们的列表。我正在探索带有额外隐藏文件输入的选项,但它似乎不起作用。我对ajax没有经验,但如果您有一个易于学习的示例,我愿意接受您的建议。谢谢是的,不幸的是,我确实需要支持较旧的浏览器。我很喜欢这个HTML5网站——非常感谢你的链接我最终得到的解决方案与此非常接近-感谢您让我走上正确的道路: