如何下载文件
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 上下文紧密耦合,使其可移植性大大降低,并且非常难以进行单元测试。以上是关于如何下载文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在网上批量下载类似的文件,或者直接把整个文件夹下载下来,链接看问题补充,谢谢!