使用 asp.net 网络表单中的流返回可下载文件
Returning a downloadable file using a stream in asp.net web forms
在 asp.net MVC 中,我可以执行如下操作,这将打开一个流:
Stream strm1 = GenerateReport(Id);
return File(strm1,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Report_" + reportId.ToString() + ".xlsx");
注意我是如何传递 strm1 的,它是一个流。然后,我可以将其命名为 Report_+ ...xlsx,如上例所示。
是否有类似的方法可以使用 c# 对 asp.net 网络表单执行此操作。
如果文件在您的网站文件夹中,您可以使用 TransmitFile or WriteFile。
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);
在 asp.net MVC 中,我可以执行如下操作,这将打开一个流:
Stream strm1 = GenerateReport(Id);
return File(strm1,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Report_" + reportId.ToString() + ".xlsx");
注意我是如何传递 strm1 的,它是一个流。然后,我可以将其命名为 Report_+ ...xlsx,如上例所示。
是否有类似的方法可以使用 c# 对 asp.net 网络表单执行此操作。
如果文件在您的网站文件夹中,您可以使用 TransmitFile or WriteFile。
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);