使用asp.net Web表单中的流返回可下载文件

Nat*_*Pet 9 asp.net

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

 Stream strm1 = GenerateReport(Id);

return File(strm1, 
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "Report_" + reportId.ToString() + ".xlsx");
Run Code Online (Sandbox Code Playgroud)

注意我是如何传递strm1这是一个流.我可以将其命名为Report_ + ... xlsx,就像上面的例子所示.

是否有类似的方法使用c#与asp.net Web表单执行此操作.

Win*_*Win 16

如果文件位于您的网站文件夹中,则可以使用TransmitFile或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();
Run Code Online (Sandbox Code Playgroud)

流

如果您的数据已经在内存中,则需要使用此方法将响应写入块中.

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);
}
Run Code Online (Sandbox Code Playgroud)


Zar*_*dan 6

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法是:

var stream = new MemoryStream();

stream.ToDownload("someFileName.ext",Response);
Run Code Online (Sandbox Code Playgroud)