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

时间:2009-06-03 12:59:32

标签: javascript jquery asp.net-mvc file download

我正在尝试做同样的事情,例如在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服务器上?这个地址应该怎么样?我试过的时候

setTimeout("window.location.href='file://localhost/C:/Downloads/file.pdf'", 2000);

我什么都没得到,http是一个未知地址的错误。

5 个答案:

答案 0 :(得分:1)

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

你可以使用类似的东西:

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

其中http://www.yourServer.com/generatePDF.asp?whatever=whatever是为用户生成pdf文件的内容

答案 1 :(得分:1)

在服务器上,您必须按照these answers中的说明将响应标题中的内容处置设置为“附件”。

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

答案 2 :(得分:1)

请参阅Haack's DownloadResult示例。它解释了(我认为)你正在尝试做的事情。除非您使用下载操作网址提供超时调用。

答案 3 :(得分: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" };
    }

答案 4 :(得分:0)

有几件不同的事情。首先,由于您正在使用MVC,因此请创建一个实际生成文件的操作并将其作为FileResult返回。该文件可以是服务器上的实际文件,但也可以动态生成 - 比如在MemoryStream中 - 以及从中创建的FileResult。如果内容不是将通过插件在浏览器中呈现的内容,则将内容设置为application / octet-stream或实际文件类型。其次,不要在呈现页面的操作中生成文件,而是使用您引用的技术调用从该页面生成FileResult的操作(尽管看起来他们正在为IE执行不同的操作)。如果MIME类型不是可以呈现的类型,则将下载它。

public ActionResult GenerateFile( string value, int other )
{

   MemoryStream file = new MemoryStream();
   ...

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