使用JQuery和ASP.NET Generic Handler上传文件 – 是否可能?

我想解决一个小问题。 我使用大多数客户端(JQuery / JavaScript)代码构建了一个完整的Web ASP.NET应用程序。 我使用通用处理程序来做一些延迟加载的数据,以及自动完成等。

其中一个要求是一个页面需要能够上传文件,以及显示有关uploadead文件的元信息。

我想知道是否有办法完全从JQuery / JavaScript上传文件。 我研究了很多插件,但它们都依赖于php后端。

我的想法是创建一个post:

$(function(){ $('#submit').live('click', function(event){ $.post('/SomeOtherHandler.ashx', //can be '/someotherpage.aspx' { filename: $('#fileUpload').val(), timestamp: (new Date()).toString() }, function(data){ //do something if the post is successful. }); }); }); 

那会有用吗? 我知道如果你包含json对象{ filename: value, timestamp: value }它将显示在HttpContext.Request.Params集合中,我可以毫无问题地阅读它。

但问题是我不知道这是如何工作的,因为FileUpload html控件只将文件名存储在其值中。 因此,我将使用文件名向我的服务器发送一个字符串,而不是字节数组。

对此有任何想法将不胜感激!

我正在使用uploadify插件(http://www.uploadify.com/) – 正如Jeremy所说,它不是在javascript中 – 这是不可能的。 它在闪光灯中。 这很容易安装。

 $('#file_upload').uploadify({ 'uploader' : '/uploadify/uploadify.swf', 'script' : '/uploadify/uploadify.ashx', 'cancelImg' : '/uploadify/cancel.png', 'folder' : '/uploads', 'auto' : true, 'fileExt': '*.xls;*.xlsx;*.csv', 'buttonText': 'Select your file', 'onError' : function (event,ID,fileObj,errorObj) { alert(errorObj.type + ' Error: ' + errorObj.info); }, 'onComplete' : function(event, ID, fileObj, response, data) { var obj = jQuery.parseJSON(response); if (obj.error != "" & obj.errror != null) { lblTable.html("error : " + obj.error); } else { lblTable.html(obj.table); lblEditData.show(); lblTable.hide(); } } }); 

并在uploadify.ashx上:

 public class uploadify : IHttpHandler { public void ProcessRequest(HttpContext context) { System.Web.HttpPostedFile file = context.Request.Files["Filedata"]; //Check extension string extension = ""; try { extension = file.FileName.Split('.')[file.FileName.Split('.').Length - 1]; if (extension != "xls" & extension != "xlsx" & extension != "csv") throw new Exception("Error of the extension"); } catch { context.Response.Write("{\"error\",\"Error with the extension of the file\""); } string linkFile = System.Web.HttpContext.Current.Server.MapPath("~") + "uploads" + "\\" + DateTime.Now.ToString("yyMMddHHmm") + APIReportPro.DocumentPDF.RandomString(4) + "." + extension; file.SaveAs(linkFile); ...etc... 

这是我为asp.net找到的最好的解决方案

将文件上载到服务器时,可以归结为三个选项。 您可以使用本机html文件上传function,Flash或Java。 Javascript无法将文件上传到服务器,它只能装饰内置的htmlfunction。 有了这个说我只能假设你试图像上传function一样模仿ajax。 如果是这样,有一种方法可以使用iframe上传文件,看起来你使用的是ajax。

您将创建一个表单

 


此表单使用iframe发布文件,这将导致主页永远不会刷新。 您可以连接jquery来处理iframe返回的响应并处理用户信息。

如果这不是你想要的等式的一部分,请随意评论并澄清你想要完成的是什么。

如果您可以指定您的应用程序通过哪些浏览器访问(例如,它是一个内部业务应用程序),那么值得查看新的File API ,它是“HTML5”技术堆栈的一部分,这些技术开始出现在最新的浏览器中。 这使您可以通过客户端Javascript直接访问文件,而无需先将文件发布到服务器。

如果您的应用程序是面向公众的,那么您仍然可以使用文件API,但是您需要在代码中检查它是否支持它,并为那些使用旧浏览器的人应用某种回退机制(例如Uploadify )。

您可以在此处以及此处以及其他位置阅读有关File API的更多信息。

我很确定这是不可能的; 如果它是一个很大的安全漏洞 – Javascript不应该从用户的硬盘驱动器获取字节。

因此,您使用本机输入类型=文件或使用预先存在的桌面字节(如Flash)。 几个流行的上传者使用这种方法…我最喜欢的是Uploadify 。 看一看,看看是否不适合您的需求。

HTH。

我已经使用Valums ajax上传控件实现了一个ASP.NET Handler来上传文件。 你可以在这里检查解决方案 您也可以上传大文件。 此处理程序支持IE,FF和Chrome浏览器。 您还可以从FF和Chrome中拖放多个文件(HTML 5)

http://ciintelligence.blogspot.com/2011/05/aspnet-server-side-handler-for-valums.html

使用jquery,您可以执行以下操作:

  $("#<%=file1.ClientID%>").change(function () { //Do stuff $(this).upload('youHandler.ashx', function (res) { //do stuff on success } } 

现在在yourHandler.ashx上你可以做类似的事情:

 public void ProcessRequest(HttpContext context) { if (context.Request.Files.Count > 0) { var fileCount = context.Request.Files.Count; var fileStram = var file = context.Request.Files[0].InputStream; //Do whatever you want } }