使用asp.net web窗体中的流返回可下载文件

使用asp.net web窗体中的流返回可下载文件,asp.net,Asp.net,在asp.net MVC中,我可以执行以下操作,打开流: Stream strm1 = GenerateReport(Id); return File(strm1, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Report_" + reportId.ToString() + ".xlsx"); 注意我是如何通过strm1的,strm1是一个流。然

在asp.net MVC中,我可以执行以下操作,打开流:

 Stream strm1 = GenerateReport(Id);

return File(strm1, 
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "Report_" + reportId.ToString() + ".xlsx");
注意我是如何通过strm1的,strm1是一个流。然后我可以将其命名为Report_u+…xlsx,如上面的示例所示

使用c#的asp.net web表单是否有类似的方法来实现此目的。

您可以使用,或者如果文件位于您的网站文件夹中

string fileName = string.Format("Report_{0}.xlsx", reportId);
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", 
   string.Format("attachment; filename={0}", fileName));
Response.TransmitFile(fileName);
Response.End();
流动 如果您的数据已经在内存中,那么您希望使用这种方法将响应分块写入

Stream stm1 = GenerateReport(Id);
Int16 bufferSize = 1024;
byte[] buffer = new byte[bufferSize + 1];

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", 
    string.Format("attachment; filename=\"Report_{0}.xlsx\";", reportId));
Response.BufferOutput = false;
int count = stm1.Read(buffer, 0, bufferSize);

while (count > 0)
{
    Response.OutputStream.Write(buffer, 0, count);
    count = stm1.Read(buffer, 0, bufferSize);
}

或者,如果您有一个要写入的流,只需将其复制到响应流:

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename={your file name}");
Response.OutputStream.Write(stream, 0, stream.length);
Response.End();

添加相同的代码只是为了可见性

我使用此扩展名将流作为可下载文件发送:

public static class ToDownloadExtention
{
   public static void ToDownload(this Stream stream, string fileName, HttpResponse response)
    {
        response.Clear();
        response.ContentType = "application/octet-stream";
        response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileName));
        stream.CopyTo(response.OutputStream);
        response.End();
    }
}
用法是:

var stream = new MemoryStream();

stream.ToDownload("someFileName.ext",Response);

您的问题不是打开流,而是将其作为可下载文件返回。谢谢。我应该将流的值放在-strm1的什么位置,如我的示例中所示,strm1的数据类型是什么?你能把剩下的代码发出去吗?我上传了代码。它是Stream stm1=GenerateReport(Id);谢谢你的帮助。我更新了代码,让你可以分块写回复。谢谢。但是如何指定文件名呢。