在页面完成后加载文件而不重定向

问题描述:

我正在尝试做几乎相同的操作,例如在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未知地址的错误。

Haack's DownloadResult例子。它解释了(我认为)你准备做的事情。除了你会提供超时通话与你的下载动作网址。

您要求用户的浏览器在他们自己的计算机上查找文件...您试图保存在那里。

你可以使用类似:

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

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

在服务器上,你必须设置内容部署在响应头“附件“,如these answers中所述。

如果这样做,下载不会影响当前浏览器中显示的页面。因此,如果您使用Javascript发起获取附件的请求,则浏览器将仅保留该页面,并且用户将看到带有打开/保存/取消问题的消息框。

几个不同的事情。首先,由于您使用的是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

您可以创建自己的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" }; 
    }