2016-05-09 70 views
0

我試圖添加一個方法,使用我的網格視圖中的鏈接,然後從服務器以流的形式獲取文件,然後提示用戶在哪裏保存它。我已經將System.Windows.Forms引用添加到我的控制器,然後添加了以下方法。無法獲得SaveFileDialog與我的網頁

[HttpGet] 
[Authorize] 
public void DownloadAssetStream(int assetID) 
{ 
    //gStream created from server file. 
    Stream myStream = gStream; 
    SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

    saveFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*"; 
    saveFileDialog1.FilterIndex = 2; 
    saveFileDialog1.RestoreDirectory = true; 

    if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
      if ((myStream = saveFileDialog1.OpenFile()) != null) 
      { 
       // Write file from stream. 
       myStream.Close(); 
      } 
     } 
    } 
} 

沒有錯誤,但在代碼打線if (saveFileDialog1它去哪兒冒出來,對話不會出現。我錯過了什麼?

+2

保存文件對話框是windows窗體組件。它不會在asp.net頁面中工作。 – Nino

回答

0

有一對夫婦的有用的回覆顯示瞭如何將文件作爲Stream返回,但爲了顯示資源管理器窗口,由於瀏覽器的安全性,這是不可能的。任何想要允許用戶定義他們自己的目標位置的人都必須使用瀏覽器自己的下載機制,它可以在本地下載文件,然後爲用戶提供將它保存到哪裏的選項。

2

您錯過了不能在ASP.NET應用程序中使用Windows控件。它可能在Visual Studio中工作,但不在現實世界中。

,而不是試圖打開一個文件對話框,使用結果發送到流,例如FileStreamResult

return new FileStreamResult(gStream, "application/pdf"); 

第二個參數是內容類型,例如爲我所用的內容類型爲PDF文件。

+0

感謝您的回覆,我被要求用Windows資源管理器窗口提示用戶(如使用Fileupload組件)來定義下載流的位置。上面沒有做任何事情,我應該如何從我的chtml剃刀文件調用DownloadAssetStream來獲得一個窗口來定義流的目標位置? – user616076

+1

這是瀏覽器決定的,不是你。您可以按照適當的路線通過URL訪問該操作。 –

+0

你似乎錯過了整個觀點,即使我返回一個文件流,我需要用戶確定將它保存在哪裏。由於看起來由於安全性,大多數瀏覽器不允許瀏覽器風格彈出,所以我將不得不掛鉤瀏覽器自己的下載方式,並告訴項目經理他們的請求是不可能的。 – user616076

0

可以在action

return File(gStream, "application/pdf", "DesiredNameToSave"); 

返回File因此您需要在操作的返回類型更改爲ActionResult處理所有類型支持的返回值

public ActionResult DownloadAssetStream(int assetID)