【问题标题】:ASP.Net Transmit FileASP.Net 传输文件
【发布时间】:2011-12-09 10:40:11
【问题描述】:

我正在 ASP.net 中编写一个 web 应用程序。

我正在尝试显示一个文件对话框,用于从服务器下载内容。

我将适当的文件数据存储在一个名为 file 的变量中。

文件具有以下字段: FileType - 文件的 MIMEType
FilePath - 服务器端文件路径

这是目前为止的代码:

Response.Clear();
Response.ContentType = file.FileType;
Response.AppendHeader("Content-Disposition", "attachment; filename=" +     GetFileName(file));
Response.TransmitFile(file.FilePath) ;
Response.End(); 

GetFileName 是一个从附件对象中获取文件名的函数。我只存储路径。

上面的代码在一个名为“Download_Clicked”的函数中,它是一个在点击时触发的事件。该事件被映射到一个 LinkBut​​ton。

问题是当我运行上面的代码时,什么也没有发生。不出现标准对话框。

我已尝试进行标准故障排除,例如确保文件存在并确保路径正确。他们都死定了。

我的猜测是因为我的机器也是服务器,它可能无法以某种方式正确处理。

提前致谢。

编辑 1:尝试将控制权放到另一个页面上,工作正常。

编辑 2:通过从 AJAX 更新面板移除控制来解决问题。

【问题讨论】:

  • IIS 是否知道 mime 类型?你试过使用“application/octet-stream”吗?
  • 我尝试了 octet-stream MIME 类型,但还是不行。
  • Ajax 更新面板不能很好地配合 FileUpload 控件或使用 Response 下载文件。 MSAjax 库内置了安全措施,如果您修改响应流,则会引发错误。下载动态生成的文件的常用技术是将文件数据临时存储在会话变量中,然后将用户重定向到一个页面,该页面专门在页面加载时查看该会话变量并将文件发送到浏览器。您也可以使用 http 处理程序来执行此操作,或者只是将文件上传/下载控件留在更新面板之外

标签: asp.net download transmitfile


【解决方案1】:

我找到了另一个在不移除更新面板的情况下执行此操作的方法。将下面的代码放入您的页面加载中,您现在就可以使用该按钮来触发下载。

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);

【讨论】:

    【解决方案2】:

    请改用Response.WriteFile()

    另外,不要使用Response.End()!这将中止线程。使用Response.Flush(); Response.Close();

    【讨论】:

    • 我尝试使用 Response.WriteFile。不同寻常的是,我把控制权扔到了另一个页面上,效果很好。但它在我放入的初始页面上不起作用。
    • Response.ContentType = file.FileType; - 内容类型是 MIME 内容类型,不是文件类型。您可以搜索常见内容类型的列表,以匹配您输出到客户端的文件。检查您的“损坏”页面是否未发送任何标头 - 一旦将这些标头发送到客户端,您就无法重新发送它们。
    • file.FileType 是文件的 MIME 类型。它仅用于输出。这是向客户端发送内容的唯一函数,页面上没有其他内容可以发送内容。
    【解决方案3】:

    尝试改变

    Response.AppendHeader("Content-Disposition", "attachment; filename=" +     GetFileName(file));
    

    Response.AppendHeader("Content-Disposition", "attachment; filename=" +     Path.GetFileName(GetFileName(file))));
    

    如果这不起作用,您始终可以使用 Response.BinaryWrite 或 Resonse.Write 将文件流式传输到 Web 浏览器 以下是使用 Response.Write 或 Response.BinaryWrite 传输文件的方法。将这些函数放在某个库中,然后根据需要调用它们

     public void SendFileToBrowser(String FileName, String MIMEType, String FileData)
        {
            Response.Clear();
            Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);
            Response.ContentType = MIMEType;
            Response.Buffer = true;
            Response.Write(FileData);
            Response.End();
        }
    
        public void SendFileToBrowser(String FileName, String MIMEType, Byte[] FileData)
        {
            Response.Clear();
            Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);
            Response.ContentType = MIMEType;
            Response.Buffer = true;
            Response.BinaryWrite(FileData);
            Response.End();
        }
    

    然后在某个地方你像这样调用这些函数

    SendFileToBrowser("FileName.txt", "text/plain", "Don't try this from an Update Panel. MSAjax does not like it when you mess with the response stream.");
    

    【讨论】:

    • 抱歉,这也没有解决。仍然一无所获。
    • 我添加了 Response.Write 和 Response.BinaryWrite 方法来传输文件
    【解决方案4】:

    查看初始帖子的编辑。

    删除了 Ajax 更新面板以解决错误。面板正在停止将帖子发送回服务器。

    有关详细信息,请参阅 Cris Valenzuela 的评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-27
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多