2010-02-03 25 views
1

我希望能夠做到這一點:帶有URL的Response.WriteFile可能嗎?

Response.WriteFile ("http://domain/filepath/file.mpg") 

但是,我得到這個錯誤:

Invalid path for MapPath 'http://domain/filepath/file.mpg' 
A virtual path is expected. 

WriteFile方法不會出現與網址的工作。有沒有其他方法可以將URL的內容寫入我的頁面?

謝謝。

+0

WriteFile方法將指定文件的內容作爲文件塊直接寫入HTTP響應輸出流。您尚未指定文件的有效路徑。 – DaveB 2010-02-03 18:35:13

回答

2

如果您需要的代碼以這種方式工作,那麼你將必須動態地將它下載到你的服務器第一:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://domain/filepath/file.mpg"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream file = response.GetResponseStream(); 

從這一點來說,你有文件的內容作爲流並且您將不得不讀取/寫入響應的字節。

然而,我會提到,這不一定是最佳的 - 你會殺死你的帶寬,因爲每個文件將使用比必要的更多的資源。

如果可能,將文件移動到您的服務器,或重新考慮您正在嘗試執行的操作。

+0

該架構將使文件實際存儲在雲中。我希望用戶直接下載而無需通過我的Web服務器 - 這樣我就可以優化帶寬。 Response.Redirect方法有效,但不幸的是,我無法重命名文件(該文件與名稱中的ID一起存儲)。任何想法我怎麼能做到這一點? – Nick 2010-02-03 22:22:01

+0

在這種情況下,重定向到另一臺服務器上的腳本,爲您做到這一點。 問題是,您正在嘗試執行HTTP協議所不允許的操作(即,所有內容都必須是1個客戶端請求/ 1個服務器響應) – riwalk 2010-02-03 22:47:23

+0

如何在響應中使用Stream對象?可以用它來配合Response.AppendHeader(「Content-Disposition」,「attachment; filename = video.mpg」);這樣我可以更改名稱? – Nick 2010-02-03 23:01:08

0

基本上你有幾個選擇。您可以將文件下載到您的服務器並通過Response.WriteFile進行提供,也可以重定向到實際位置。如果文件已經在您的服務器上,您只需提供到Response.WriteFile而不是url的文件系統路徑,或通過刪除http://domain來使用虛擬url。

0

一個可能的解決方案是簡單地使用:

Response.Redirect("http://domain/filepath/file.mpg") 

不過,我不知道如果這是你真正想要做還是不做。

+1

使用Response.WriteFile,我可以選擇分配可下載的文件名。例如:Response.AppendHeader(「Content-Disposition」,「attachment; filename = video.mpg」); 我不能用reponse.redirect做,除非我攔截響應並以某種方式更改文件名 – Nick 2010-02-03 18:34:34