asp.net 在回发中将字节数组作为文件下载

snz8szmq  于 2023-05-19  发布在  .NET
关注(0)|答案(1)|浏览(170)

我有一些旧的网页,其中一个文件下载到用户。这些页面在五六年前开发时可以工作,但现在不工作了。我的下载代码在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>
ffvjumwh

ffvjumwh1#

这段代码应该可以工作,这对我来说是可行的:

protected void cmdDownLoad_Click(object sender, EventArgs e)
    {

        string filename = Server.MapPath(@"~/Content/Fighters/Add.png");
        string filenameONLY = Path.GetFileName(filename);

        byte[] byteArray = File.ReadAllBytes(filename);
        // 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=" + filenameONLY);
        Response.BinaryWrite(byteArray);
        Response.Flush();

    }

你现在也可以使用这个:(需要.net 4.5或更高版本)。

protected void Button1_Click(object sender, EventArgs e)
    {
        string filename = Server.MapPath(@"~/Content/Fighters/Add.png");
        string filenameONLY = Path.GetFileName(filename);
        string sMineType = MimeMapping.GetMimeMapping(filename);

        FileInfo sFinfo = new FileInfo(filename);

        Response.Clear();
        Response.ContentType = sMineType;
        Response.AppendHeader("Content-Length", sFinfo.Length.ToString());

        Response.AppendHeader("Content-Disposition", "attachment; filename=" + filenameONLY);
        Response.TransmitFile(filename);
        Response.End();

    }

这两个例子都可以工作,并且只需单击一个按钮即可工作,当然这是一个postback。

编辑:更新面板问题

问题不在于后回,如上所示。问题是你只能得到一个响应,这意味着你要么下载文件,要么选择更新网页上的控件--你不能同时做上面的例子。
我怀疑你真实的的问题是我可以更新Web表单上的控件,然后下载文件-一个巨大的,巨大的和珠峰峰的不同问题。
作为一般规则,您会发现下载在放置在更新面板中时不起作用。

相关问题