2011-04-05 55 views
4

我有一个ASP.NET网页与FileUpload控件ASP.NET网页无响应文件的过程中上传


     <asp:FileUpload ID="fileUploadTN" style="width:250px" runat="server" /> 

一个问题是,上传大文件时,我的asp.net会话超时。这是由于DiscountAsp.net的限制以及不可重写的20分钟会话超时(除非切换到SqlServer)。上传大文件没有问题,只是会话完成后不久即死亡。

所以,我有一个解决方法,让一个javascript定时器定期访问另一个网页,以保持会话存活时间更长。

 
     function timerEvent() 
     { 
     jQuery.get("/svc.aspx?act=ping", function(data) { }); 
     } 

除了在文件上传这个伟大的工程。在文件上传过程中,HTTP GET没有响应,请求也没有响应到svc.aspx页面。我可以在提琴手中观看并发生GET,但没有任何反应。文件上传完成后,响应再次启动。但是,如果长文件上传,我的会话可能会超时。

即使我在浏览器中打开一个新窗口并直接进入svc.aspx页面,它也会被请求卡住。我可以在另一个应用程序浏览器(例如FF - > Chrome)窗口中打开一个窗口,然后svc.aspx响应。因此,在同一个会话中,似乎是其他HTTP GET在文件上传过程中无法响应的问题。

+0

尝试将其更改到'ashx'。 – SLaks 2011-04-05 15:24:40

+0

这是做什么的? – jocull 2011-04-05 17:28:15

+0

我会尝试这个,但是它本身并不会让会话保持活跃状态​​。在一些研究中,看起来像我需要在IHttpHandler中实现IRequiresSessionState。稍后将进行更新 – Ron 2011-04-05 18:53:50

回答

0

对于较大的文件,最好使用一些Flash上​​传器 - 例如UploadifySWFUpload 我更喜欢使用Uploadify。下面是我的项目的例子。 你必须包括uploadify.css和jQuery,swfobject的和jquery.uploadify JavaScript文件和初始化uploadify在你的ASPX页面:

<link href="uploadify.css" rel="stylesheet" type="text/css" /> 
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script> 
<script src="Scripts/swfobject.js" type="text/javascript"></script> 
<script src="Scripts/jquery.uploadify.v2.1.4.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    // <![CDATA[ 
    $(document).ready(function() { 
     $('#fileInput').uploadify({ 
      'uploader': 'Scripts/uploadify.swf', 
      'script': 'Upload.ashx', 
      'scriptData': {}, 
      'cancelImg': 'Images/cancel.png', 
      'auto': true, 
      'multi': true, 
      'fileDesc': 'PDF files', 
      'fileExt': '*.pdf', 
      'queueSizeLimit': 90, 
      'sizeLimit': 4000000, 
      'buttonText': 'Browse', 
      'folder': '/uploads', 
      'onComplete': function (event, queueID, fileObj, response, data) { 
       var message = '<div>' + response + '</div>'; 
       var results = $('#uploadResults'); 
       results.html(message + results.html()); 
      }, 
      'onAllComplete': function (event, queueID, fileObj, response, data) { 
      } 
     }); 
    }); 

// ]]></script> 

代替ASP:FileUpload控件使用输入型 - 文件。这里需要HTML:

<input id="fileInput" name="fileInput" type="file" /> 
    <div id="uploadResults"></div> 

然后创建ASHX处理程序将处理您上传:

public class Upload : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     try 
     { 
      HttpPostedFile file = context.Request.Files["Filedata"]; 

     // Validate file for content length, extension etc. 
     // Store file on server or do what you want with file 
     // Use context.Response.Write to send messages which will be displayed in <div id="uploadResults"></div> 

     } 
     catch (Exception ex) 
     { 
      context.Response.Write("Failed to upload file"); 
     } 
    } 
} 
+0

我想我意识到ASP.NET文件上传器不适合大文件。我正在考虑http://ajaxuploader.com,但我也会看看这个。我们已经在使用Flash,所以你的建议应该没问题。 AjaxUploader已经完全是ASP.NET,所以在完成通知等时可能会更容易集成,但似乎Uploadify有一个事件,因此应该也能够通知我的UpdatePanel。 – Ron 2011-04-06 11:47:32