2013-02-07 76 views
1

我在服務器中有一個文件。使用ASP.NET從服務器下載所有類型的文件

我想下載這個文件。

我使用此代碼

try 
    { 
     Response.Clear(); 
     Response.ClearContent(); 
     Response.ClearHeaders(); 
     Response.BufferOutput = true; 

     if (File.Exists(Server.MapPath("~/Upload/" + file))) 
     { 
      Response.AddHeader("Content-Disposition", "attachment; filename=" + file); 
      Response.ContentType = "application/octet-stream"; 
      Response.WriteFile(("~/Upload/" + file)); 
      Response.End(); 
      HttpContext.Current.ApplicationInstance.CompleteRequest(); 
     } 
     else 
     { 
      if (Request.UrlReferrer != null) 
      { 
       Type csType = GetType(); 
       string jsScript = "alert('File Not Found');"; 
       ScriptManager.RegisterClientScriptBlock(Page, csType, "popup", jsScript, true); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     string errorMsg = ex.Message; 
     ScriptManager.RegisterClientScriptBlock(Page, GetType(), "popup", errorMsg, true); 
    } 

但是,當我用這個,我得到錯誤

無法因爲代碼優化或本機框上調用堆棧的頂部,以評估表達。

在代碼

到Response.End();

如何下載所有類型的文件?

回答

0

這是Web窗體,MVC還是自定義的IHttpHandler?

無論如何,您不需要從函數中調用Response.End()HttpContext.Current.ApplicationInstance.CompleteRequest(),只需return,並確保沒有其他任何內容寫入響應。

+0

非常感謝,這是一個Web形式。我刪除'Response.End()HttpContext.Current.ApplicationInstance.CompleteRequest()',我不會收到錯誤,但不要下載文件。 – Niloo

+0

你能夠調試你的代碼嗎?你能否逐步瀏覽你的代碼,看看是否有任何異常被拋出或被捕獲?考慮刪除你的'try/catch'塊。 – Dai

+0

是的,我調試它,但不會拋出或捕獲任何異常。 – Niloo

0

你試過:

Response.TransmitFile(Server.MapPath("~/Upload/" + file)); 

代替:

Response.WriteFile(("~/Upload/" + file)); 

你也應該刪除BufferOutput(壞主意與Response.End()Response.Flush()

+0

啊,很好,我沒有看到啓用了緩衝。這解釋了它。 – Dai

+0

非常感謝,我使用'Response.TransmitFile(Server.MapPath(「〜/ Upload /」+ file));'但不會下載。 – Niloo

+0

@Niloo你也應該刪除Response.BufferOutput = true; – jbl