2009-06-03 77 views
1

我正在嘗試做幾乎相同的操作,例如在sourceforge上。用戶創建一些數據後,我生成一個文件,我希望它在頁面加載後提供給他。然而,我幾乎不知道JavaScript和簡單複製粘貼在頁面完成後加載文件而不重定向

< script type="text/javascript"> 
var download_url = "http://downloads.sourceforge.net/sourceforge/itextsharp/itextsharp-4.1.2-dll.zip?use_mirror=dfn"; 


function downloadURL() { 
    if (download_url.length != 0 && !jQuery.browser.msie){ 
     window.location.href = download_url; 
    } 
} 

jQuery(window).load(downloadURL); 

< /script> 

是不夠的。用戶下載文件很重要,那麼該怎麼做?

與之前相關的問題是 - 在哪裏存儲我創建的文件?一次使用asp.net開發服務器,然後在真正的iis服務器上?這個地址應該怎麼看?當我嘗試

我什麼都沒有,與http未知地址的錯誤。

回答

1

Haack's DownloadResult例子。它解釋了(我認爲)你準備做的事情。除了你會提供超時通話與你的下載動作網址。

1

您要求用戶的瀏覽器在他們自己的計算機上查找文件...您試圖保存在那裏。

你可以使用類似:

window.location.href='http://www.yourServer.com/generatePDF.asp?whatever=whatever' 

其中http://www.yourServer.com/generatePDF.asp?whatever=whatever是什麼是生成的PDF文件的用戶

1

在服務器上,你必須設置內容部署在響應頭「附件「,如these answers中所述。

如果這樣做,下載不會影響當前瀏覽器中顯示的頁面。因此,如果您使用Javascript發起獲取附件的請求,則瀏覽器將僅保留該頁面,並且用戶將看到帶有打開/保存/取消問題的消息框。

0

幾個不同的事情。首先,由於您使用的是MVC,因此請創建一個實際生成該文件的操作並將其作爲FileResult返回。該文件可以是服務器上的實際文件,但也可以動態生成 - 例如在MemoryStream中 - 以及由此創建的FileResult。如果內容不是通過插件在瀏覽器中呈現的內容,則將內容設置爲application/octet-stream或實際文件類型。其次,不要在呈現頁面的動作中生成文件,而是使用所引用的技術調用從該頁面生成FileResult的動作(儘管它看起來像是在爲IE做一些不同的事情)。如果MIME類型不是可以呈現的MIME類型,它將被下載。

public ActionResult GenerateFile(string value, int other) 
{ 

    MemoryStream file = new MemoryStream(); 
    ... 

    return File(file, "application/octet-stream"); 
} 
+0

的問題是,我使用的iText庫來生成pdf。因此,要創建的文件屬於Document類型,與FileResult不兼容。但是,如果有另一種方式來生成PDF ..? – Trimack 2009-06-03 14:06:52

1

您可以創建自己的PdfResult延伸的ActionResult這樣的:

public class PdfResult : ActionResult 
{ 
    public byte[] Content { get; set; } 
    public string FileName { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.AddHeader("content-disposition", "attachment; filename=" + this.FileName); 
     response.AddHeader("content-length", this.Content.Length.ToString()); 
     response.ContentType = "application/pdf"; 

     using (MemoryStream memoryStream = new MemoryStream(this.Content)) 
     { 
      memoryStream.WriteTo(response.OutputStream); 
     } 

     response.End(); 
    } 

然後在你的行動,你可以簡單地返回文件,如下所示:

public ActionResult Pdf(string param1...) 
    { 
     var content = GeneratePdf(); //etc 
     var fileName = AssignFileName(); 

     return new PdfResult { Content = content, FileName = fileName + ".pdf" }; 
    } 
相關問題