我有一些旧的网页,其中一个文件下载到用户。这些页面在五六年前开发时可以工作,但现在不工作了。我的下载代码在pageload上工作,但我需要在按钮被单击时进行回发。导致此错误的:“发送HTTP标头后,服务器无法设置内容类型。”
我发现参考资料说要用iframe来做这件事。我的源是在回发中创建的字节数组。我找不到任何例子来说明如何做到这一点。
有人能给我指个参考吗?
这是我正在使用的测试页面。
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
}
else
{
RadListBox1.Items.Clear();
}
}
protected void RadButton1_Click(object sender, EventArgs e)
{
ErrorOutput("Button pressed.");
//DownloadToBrowser();
Go();
}
protected void Go()
{
string fileName = "Drawing1.png";
string orgPath = @"..\tempfiles\";
string filePath = MapPath(Path.Combine(orgPath, fileName));
byte[] byteArray = File.ReadAllBytes(filePath);
ErrorOutput(byteArray.Count() + " Bytes in the file.");
System.Web.HttpResponse res = HttpContext.Current.Response;
Response.ContentType = "image/png";
Response.Clear();
Response.BufferOutput = true;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(byteArray);
Response.Flush();
} // Go() ...
protected void ErrorOutput(string theError)
{
RadListBox1.Items.Add(theError);
}
} // class Test ...
这里是HTML;
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="KCNet2.Report.Test" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<h2>Download Test</h2>
<asp:UpdateProgress ID="UpdateProgress1" runat="server"
AssociatedUpdatePanelID="pnlPrint">
<ProgressTemplate>
<div class="progress">
<img alt="" class="style1" src="../images/ajax-loader.gif" />
Processing...
</div>
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="pnlPrint" runat="server">
<ContentTemplate>
<telerik:RadButton ID="RadButton1" runat="server" Text="Go" OnClick="RadButton1_Click" AutoPostBack="true"></telerik:RadButton>
<telerik:RadListBox ID="RadListBox1" runat="server"></telerik:RadListBox>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
</asp:Content>
1条答案
按热度按时间ffvjumwh1#
这段代码应该可以工作,这对我来说是可行的:
你现在也可以使用这个:(需要.net 4.5或更高版本)。
这两个例子都可以工作,并且只需单击一个按钮即可工作,当然这是一个postback。
编辑:更新面板问题
问题不在于后回,如上所示。问题是你只能得到一个响应,这意味着你要么下载文件,要么选择更新网页上的控件--你不能同时做上面的例子。
我怀疑你真实的的问题是我可以更新Web表单上的控件,然后下载文件-一个巨大的,巨大的和珠峰峰的不同问题。
作为一般规则,您会发现下载在放置在更新面板中时不起作用。