【发布时间】:2019-03-10 06:43:41
【问题描述】:
我正在尝试在我的 web api 中生成一个 excel 文件/流,并在 HttpResponseMessage 中将其返回,以便在 Angular 5 中将其作为下载提供给客户端。
生成成功,生成一个 xlsx 文件并保存在服务器上,但是当我在 httpResponseMessage 的内容中返回它时,我的浏览器只显示一些 json 而不是整个 excel 文件。
{"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1,"minorRevision":-1},"content":{"headers":[{"key":"Content-Disposition","value":["attachment; filename=636742856488421817.xlsx"]},{"key":"Content-Type","value":["application/ms-excel"]},{"key":"Content-Length","value":["22780"]}]},"statusCode":200,"reasonPhrase":"OK","headers":[],"requestMessage":null,"isSuccessStatusCode":true}
这就是我创建 excel 文件并返回它的方式:
var dataBytes = File.ReadAllBytes(fileName);
var dataStream = new MemoryStream(dataBytes);
HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK);
httpResponseMessage.Content = new StreamContent(dataStream);
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
httpResponseMessage.Content.Headers.ContentLength = dataStream.Length;
【问题讨论】:
-
您可以尝试使用 Chrome,并将 chrome 收到的内容发送给我们(来自开发工具,F12)吗?
-
由于您的 excel 已经在磁盘上,您只能这样做(这适用于 webapi 2.1,未在核心上尝试过):
return File(fileName, System.Net.Mime.MediaTypeNames.Application.Octet, shortFileName); -
shortFileName 类似于“report.xlsx”,文件名类似于“c:\report\report.xlsx”。您不必告诉您的客户您的本地完整路径;-)
-
嗨@DanielBlais,我已经修复了它,并且我使用了与您描述相同的方式。我什至删除了保存,现在我使用 File() 返回流。我面临的问题是我的逻辑不在 Api Controller 中,而是在更深层次的辅助类中。所以 File() 没有工作。然后我更改了帮助程序类中的方法,以将 Stream 而不是 Httpresponsemessage 返回到控制器。在我的控制器中,我使用 File() 将文件返回给客户端。
-
在 Angular 中我使用 Blob()。请参阅下面的答案以获取完整的解决方案。感谢您抽出宝贵时间 DanielBlais