如何下载文件

Posted

技术标签:

【中文标题】如何下载文件【英文标题】:How to Download File 【发布时间】:2013-09-29 17:17:46 【问题描述】:

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

Download file of any type in Asp.Net MVC using FileResult? + How to convert an Stream into a byte[] in C#? Using a FileStreamResult with a MemoryStream in ASP.NET MVC 3 Writing A Custom File Download Action Result For ASP.NET MVC

每次我运行它时它都会完美无误地运行代码,但不会“踢出”要下载的文件(在另存为对话框或 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 网络开发工具的图片 抱歉,如果您使用支持的浏览器,小图片(如果您无法使用 ctl+MouseWheel 滚动查看)。

【问题讨论】:

最后一行代码(“没有显示任何东西”)是正确的方法。请详细说明它没有显示任何内容。服务器是否有响应?当你调试这个时,它在哪里失败了? 好吧,我在 Chrome 中使用 HTTP 标头和其他扩展程序以及其他一些扩展程序打开了我的浏览器,并打开了开发者工具,这不会显示任何“出错”的迹象。我还能说什么,是的,我在 VS 中单步执行了我的代码,没有任何缺陷? 在浏览器的调试工具中,服务器的响应是什么?是否有一个实际文件通过并且它是空的和/或损坏的?如果您在服务器端保存文件,它是有效文件吗? 我没有尝试在服务器端保存它,请允许我一些时间尝试一下,就浏览器而言,它没有向我显示任何有关任何文件的信息。 (控制台为空)。 奇怪的是浏览器不显示任何东西。应该有 something (可能在网络选项卡上?我不熟悉 Chrome 的工具 UI)描述发送到服务器的请求和从服务器接收到的响应。你是如何提出请求的?它是一个链接,一个表单帖子,也许你正试图通过 AJAX 做到这一点? (如果是后者,那么 that 可能是问题所在,而不是服务器端代码中的任何内容。由于浏览器处理 AJAX 响应的方式与正常响应不同。不会t 是保存文件的对话框。) 【参考方案1】:

(回应上面的评论。)

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

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

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

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

【讨论】:

非常感谢您的链接!【参考方案2】:

使用您拥有的内存流,您可以在保存 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()

【讨论】:

从控制器操作返回 ActionResult 比直接写入 Response 对象首选。您的方法将控制器与 HTTP 上下文紧密耦合,使其可移植性大大降低,并且非常难以进行单元测试。

以上是关于如何下载文件的主要内容,如果未能解决你的问题,请参考以下文章

如何下载pdf文件

文件如何上传接口又如何下载下来

如何在网上批量下载类似的文件,或者直接把整个文件夹下载下来,链接看问题补充,谢谢!

如何避免将文件下载到下载文件夹并仅在c#中下载到其他特定文件夹

如何修改迅雷下载文件的URL

百度网盘里的文件怎么下载到电脑 百度网盘文件如何下载到电脑