当前位置: 首页 > 知识库问答 >
问题:

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

惠文彬
2023-03-14

在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 web表单。

共有3个答案

羊舌兴文
2023-03-14

或者,如果您已准备好要写入的流,只需将其复制到响应流中:

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();

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

东郭鹤龄
2023-03-14

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

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);
满玉泽
2023-03-14

如果文件在您的网站文件夹中,您可以使用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();

如果你的数据已经在内存中,你需要这个方法,它以块的形式写入响应。

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);
}
 类似资料:
  • 在我的主要活动中: 编辑:我在主线程上运行了网络代码,它引发了一个异常。现在为下载创建一个新的线程,它将获得示例PDF(http://www.pdf995.com/samples/PDF.PDF),并将其内容放入文件中。感谢@GreenApps!

  • 我正在使用Apache Commons Net FTP库进行FTP客户端项目。我已成功登录,但当我尝试从FTP服务器下载文件时,得到了空文件或null。 我尝试设置文件传输模式或文件类型,但都不起作用。 下面是我启动客户端的代码示例: 这是检索文件的代码: 我还尝试添加了一些其他属性,如: 但都不管用。 这可能与服务器配置有关吗?实际上我没有对FTP服务器的配置访问权限。提供商只给了我对它的读取权

  • 问题内容: 我是AJAX的新手。我正在使用AJAX向服务器发送请求。该服务返回一个文本文件。但是,返回数据时没有下载框出现。返回文件的其余服务如下: 我的AJAX调用如下: 没有AJAX,文件下载成功。使用AJAX时,它不会下载文件。请咨询。 问题答案: 建议很简单:您不能通过AJAX下载文件-这是一项安全策略。我的意思是您可以下载数据,但不能从JavaScript端将其保存到磁盘。 如果您想点击

  • 我有一个jsp页面,其中我使用了Spring表单标签,这样我就可以使用模型属性并将数据绑定到它。它在提交表单时工作正常,但在添加模型属性后,控制器将恢复为空。这里有什么问题?我的代码是-proflie.jsp AccountController类

  • 我使用Springboot,我想生成zip文件,然后返回前端。

  • 问题内容: 我有一个Spring MVC方法,返回一个。根据检索到的特定数据, 有时 需要将数据流返回给用户。其他时候,它将返回除流之外的其他内容,有时还会返回重定向。我绝对希望它是一个流而不是字节数组,因为它可能很大。 当前,我使用以下代码片段返回流: 不幸的是,这不允许Spring 数据实际填充响应中的HTTP标头。这是有道理的,因为我的代码在Spring接收之前写入了。 某种程度上让Spri

  • 问题内容: 我在使用通过相对URL访问的字体时遇到问题。 当我访问网页时,字体不起作用,在控制台中,我得到以下信息: 通过将URL复制/粘贴到浏览器地址栏中来访问文件,这表明它是正确的URL,因为我可以下载字体。 问题答案: 乔纳森·邱(Jonathan Kew)对有关MozillaBugzilla条目的回应的提示: 我相信这是按设计工作的。AIUI,这里的问题是,对于从file:// URI加载

  • 我已经尝试了很多,比如使用和array一起使用,调整了我的Validator方法来设置其他一些东西,但都没有效果。 我觉得有一个很简单的解决办法,但我就是找不到... 编辑1:我创建了一个stackblitz https://stackblitz.com/EDIT/angular-ysyb9i?file=src%2fapp%2fapp.component.html 说明:输入接受任何字符串,在取消