2011-05-28 68 views
0

我想在ASP.NET C#應用程序中實現強制下載文件對話框。我想強制下載的文件是Web服務器上沒有本地可用的媒體文件,但是是從不同位置提供的。強制下載文件對話框不工作 - ASP.NET C#

我收到一個錯誤'http://remote-site-to-webserver/somefile.asf'不是有效的虛擬路徑。

...我已經尋找解決方案的網絡,但是所有的例子指向相對路徑使用

使用Server.Mappath

在下面的例子中我創建了一個頁面webhandler.ashx併發送下載請求到該頁面在服務器上。

<%@ WebHandler Language="C#" Class="DownloadHandler" %> 

using System; 
using System.Web; 

public class DownloadHandler : IHttpHandler { 
public void ProcessRequest(HttpContext context) { 
var fileName = "http://remote-site-to-webserver/somefile.asf"; 
var r = context.Response; 
r.AddHeader("Content-Disposition", "attachment; filename=" + fileName); 
r.WriteFile(context.Server.MapPath(fileName)); 
} 
public bool IsReusable { get { return false; } } 
} 

回答

0

爲了使下載從另一臺服務器啓動,您需要向客戶端發送重定向答案(Response.Redirect(mediaURL))。

因此,您無法強制從您的Web服務器下載對話框,因爲瀏覽器會向另一個服務器發送單獨的請求。這必須在提供媒體的服務器上解決。

唯一的選擇是您充當中間人,即您將媒體文件下載到您的服務器並將其作爲響應發送給客戶端。如果它是一個容易裝入內存的小文件,這應該不會太難。但是,如果它是一個大文件,它可能涉及一些棘手的編碼,因此您可以分段接收和發送它。

0
Server.MapPath() 

不用於遠程HTTP文件。它只是一個將虛擬地址轉換爲物理地址的工具,即通過給Server.MapPath方法提供「〜/ Files/blah.txt」來檢索「C:\ inetpub \ wwwroot \ MyWebSite \ Files \ blah.txt」。

如果您有興趣從另一個Web服務器下載文件,您將不得不使用HttpWebRequest類。

這是一個示例代碼:

   HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://remote-site-to-webserver/somefile.asf"); 
       httpRequest.Credentials = CredentialCache.DefaultCredentials; //or a NetworkCredential if needed 

       HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 

       Stream dataStream = httpResponse.GetResponseStream(); 

現在你可以輸出數據流進你的迴應。

1

Content-Disposition標題看起來不對我。我覺得應該是:

r.AddHeader("Content-Disposition", 
    "attachment; filename=DefaultNewFilename.ext"); 

的文件名是給下載的文件的默認名稱...或者。換句話說它就是顯示在瀏覽器保存對話框。

您可能還需要:

r.AddHeader("Content-Type", "application/octetstream"); 

我不知道這是需要....但是我總是包括它的視頻文件等等。