2011-04-05 15 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