【问题标题】:Load file after page is complete without redirecting页面完成后加载文件而不重定向
【发布时间】:2010-10-30 23:37:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    参见Haack's DownloadResult 示例。它准确地解释了(我认为)你正在做什么。除非您使用下载操作网址提供超时调用。

    【讨论】:

      【解决方案2】:

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

      你可以使用类似的东西:

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

      http://www.yourServer.com/generatePDF.asp?whatever=whatever 是为用户生成 pdf 文件的位置

      【讨论】:

        【解决方案3】:

        在服务器上,您必须将响应标头中的内容处置设置为“附件”,如these answers 中所述。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            几个不同的东西。首先,由于您使用的是 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" );
            }
            

            【讨论】:

            • 问题是,我正在使用 itext 库来生成 pdf。因此要创建的文件是 Document 类型,与 FileResult 不兼容。但是如果有另一种生成pdf的方法..?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-19
            • 2015-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多