如何下载文件

时间:2013-09-24 13:06:46

标签: c# asp.net-mvc-4 download

我一直关注下面列出的这些链接,我找到了编写这个SMALL创建Excel和下载功能的最佳方法。 (使用EPPlus for Excel)

每次运行时都会完美地运行代码而不会出错,但不会“踢出”要下载的文件(保存为对话框或w / e)。

public ActionResult ShowReport()
    {
        using (var stream = new MemoryStream())
        {

            ExcelPackage pck = new ExcelPackage();
            var ws = pck.Workbook.Worksheets.Add("Sample1");

            ws.Cells["A1"].Value = "Sample 1";
            ws.Cells["A1"].Style.Font.Bold = true;
            var shape = ws.Drawings.AddShape("Shape1", eShapeStyle.Rect);
            shape.SetPosition(50, 200);
            shape.SetSize(200, 100);
            shape.Text = "Sample 1 text text text";

            var fileDownloadName = "sample.xlsx";
            var contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";//System.Net.Mime.MediaTypeNames.Application.Octet
            var fileStream = new MemoryStream();
            pck.SaveAs(fileStream);
            fileStream.Position = 0;

            var fsr = new FileStreamResult(fileStream, contentType);
            fsr.FileDownloadName = fileDownloadName;

            byte[] fileBytes = ReadToEnd(fileStream);
            string fileName = "example";
            return File(fileBytes, contentType, fileName);
        }
    }
  

我做错了什么/失踪了? - 我必须自己写那个对话吗?

PN:我也尝试过这种方式

 byte[] fileBytes = ReadToEnd(fileStream);
 string fileName = "example";
 return File(fileBytes, contentType, fileName);
当然,我必须弄清楚如何将Stream转换为Byte,但它也没有显示任何内容。

Chrome网络开发工具的图片 enter image description here 对于小图片(如果你看不到它用ctl + MouseWheel滚动),如果你在支持浏览器中,我们很抱歉。

2 个答案:

答案 0 :(得分:3)

(回应上面的评论帖子。)

从发布的图片看起来,实际的文件请求(列表中的最后一个)来自JavaScript代码,而不是来自普通的文档级请求。鉴于此,服务器端代码正常工作并返回正确的响应很可能

但是,由于它是一个AJAX请求,浏览器实际上并不知道如何处理响应。有一些潜在的解决方案here。理想情况下,您可能希望将此设置为正常请求,并尽可能从图片中删除AJAX。如果这不是一个选项,您仍然可以从JavaScript启动文档级请求。像这样简单:

window.location = '@Url.Action("Method", "Controller")';

这将从当前的JavaScript代码启动,但将用于整个浏览器而不是AJAX请求。这应该可以解决问题。

答案 1 :(得分:-1)

使用内存流,您可以在保存Excel包后将其简单地传递给Response对象

代码:

    Response.AddHeader("content-disposition", "attachment;filename=FILENAME.xlsx")
    Response.Charset = String.Empty
    Response.ContentType = "application/ms-excel"
    Response.BinaryWrite(stream.ToArray())
    Response.End()