2013-04-18 32 views
8

我使用filestream.write將數據從服務器傳輸到客戶端以進行下載。在那種情況下,發生的事情是我可以下載文件,但它不會在我的瀏覽器中顯示爲下載。 「下載」部分中不會顯示「另存爲」彈出窗口,也不會顯示「下載欄」。從環顧四周,我想我需要在響應頭中包含「something」來告訴瀏覽器這個響應有附件。另外我想設置cookie。要做到這一點,這是我在做什麼:在asp.net/mvc中的控制器內的操作中向http響應添加標頭

 [HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)] 
    public ActionResult Download(string name) 
    { 
      // some more code to get data in inputstream. 

      using (FileStream fs = System.IO.File.OpenWrite(TargetFile)) 
      { 
       byte[] buffer = new byte[SegmentSize]; 
       int bytesRead; 
       while ((bytesRead = inputStream.Read(buffer, 0, SegmentSize)) > 0) 
       { 
        fs.WriteAsync(buffer, 0, bytesRead); 
       } 
      } 
     } 
     return RedirectToAction("Index"); 
    } 

我得到錯誤:「System.web.httpcontext.current是一個屬性,作爲一個類型。」

我在正確的地方更新標題嗎?有沒有其他方法可以做到這一點?

回答

11

是的,你這樣做是錯誤的方式嘗試這一點,你應該在你的動作中添加標題,而不是作爲你的方法的屬性標題。

HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name) 

Request.RequestContext.HttpContext.Response.AddHeader("Content-Disposition", "Attachment;filename=" & name) 

更新 據我瞭解你在做一個AJAX調用您的控制器/動作,其通過直接調用一個動作慣於文件下載工作。你可以這樣做。

public void Download(string name) 
     { 
//your logic. Sample code follows. You need to write your stream to the response. 

      var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf"); 
      var stream = new MemoryStream(filestream); 
      stream.WriteTo(Response.OutputStream); 
      Response.AddHeader("Content-Disposition", "Attachment;filename=targetFileName.pdf"); 
      Response.ContentType = "application/pdf"; 
     } 

public FileStreamResult Download(string name) 
    { 
     var filestream = System.IO.File.ReadAllBytes(@"path/sourcefilename.pdf"); 
     var stream = new MemoryStream(filestream); 


     return new FileStreamResult(stream, "application/pdf") 
     { 
      FileDownloadName = "targetfilename.pdf" 
     }; 
    } 

在您的JS點擊按鈕,你可以做一些類似的。

$('#btnDownload').click(function() { 
      window.location.href = "controller/download?name=yourargument"; 
    }); 
+0

我試着這樣做。但它在瀏覽器的下載部分既不顯示「另存爲」對話框,也不顯示下載進度條。 – ezile

+0

這對我有用,我看到在我的測試用例中下載的視圖html。對你而言,這可能是因爲你正在重定向到行動。雖然我沒有嘗試過這種情況。只需嘗試將此標題置於索引下即可。 – PSL

+0

我會詳細一點。我在「索引」頁面,然後點擊下載,然後通過JavaScript調用下載操作。上面的代碼是在下載操作中編寫的。將文件傳輸給用戶後,我重定向到索引頁面。我很困惑,因爲我應該在什麼時候告訴瀏覽器有下載。我的意思是我使用FileStream.WriteSync發送這些東西,所以我想在發送文件之前告訴瀏覽器有一個附件,因此它會彈出「另存爲」對話框。我認爲我對這裏的工作流程感到困惑,因此不應該在何時何地進行改變。 – ezile

3

請看看here

以下取自參考網站。

public FileStreamResult StreamFileFromDisk() 
{ 
    string path = AppDomain.CurrentDomain.BaseDirectory + "uploads/"; 
    string fileName = "test.txt"; 
    return File(new FileStream(path + fileName, FileMode.Open), "text/plain", fileName); 
} 

編輯1:

添加的東西,可能會更你的興趣,從我們的好醇」 SO。 您可以檢查完整的詳細信息here

public ActionResult Download() 
{ 
    var document = ... 
    var cd = new System.Net.Mime.ContentDisposition 
    { 
     // for example foo.bak 
     FileName = document.FileName, 

     // always prompt the user for downloading, set to true if you want 
     // the browser to try to show the file inline 
     Inline = false, 
    }; 
    Response.AppendHeader("Content-Disposition", cd.ToString()); 
    return File(document.Data, document.ContentType); 
} 
0

變化:

return RedirectToAction("Index"); 

到:

return File(fs, "your/content-type", "filename"); 

並移動return語句您使用語句內。

0

在過去,我建立了一個白名單,允許一些域名iframe我的網站。記住Google的圖片緩存也用於iframe網站。

static HashSet<string> frameWhiteList = new HashSet<string> { "www.domain.com", 
                "mysub.domain.tld", 
                "partner.domain.tld" }; 

    protected void EnforceFrameSecurity() 
    { 
     var framer = Request.UrlReferrer; 
     string frameOptionsValue = "SAMEORIGIN"; 

     if (framer != null) 
     { 
      if (frameWhiteList.Contains(framer.Host)) 
      { 
       frameOptionsValue = string.Format("ALLOW-FROM {0}", framer.Host); 
      } 

     } 

     if (string.IsNullOrEmpty(HttpContext.Current.Response.Headers["X-FRAME-OPTIONS"])) 
     { 
      HttpContext.Current.Response.AppendHeader("X-FRAME-OPTIONS", frameOptionsValue); 
     } 
    } 
0
public FileResult DownloadDocument(string id) 
     { 
      if (!string.IsNullOrEmpty(id)) 
      { 
       try 
       { 
        var fileId = Guid.Parse(id); 

       var myFile = AppModel.MyFiles.SingleOrDefault(x => x.Id == fileId); 

       if (myFile != null) 
       { 
        byte[] fileBytes = myFile.FileData; 
        return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, myFile.FileName); 
       } 
      } 
      catch 
      { 
      } 
     } 

     return null; 
    } 
相關問題