0

我在控制器中有以下代码来返回一个流,该流是要在客户端下载的 Excel 文件:

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
MemoryStream memStream = ReportExporter.ExportReport(analystReport);

response.Content = new StreamContent(memStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = saveAsFileName;

return response;

当我在客户端发出请求时,它只是将响应消息的包装返回给我:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Content-Type: application/octet-stream
  Content-Disposition: attachment; filename=.xlsx
}

我相信这可能是由于标题以文本形式返回,因为这是我在 Chrome 中看到的:

Content-Type:text/html; charset=utf-8   

尝试了各种方法后,我无法弄清楚这里发生了什么。

4

2 回答 2

1

试试这个解决方案:

// Copy file to byte array
byte[] file = new byte[memStream.Length];
memStream.Read(file, 0, file.Length);

// Send file
Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "inline;filename=" + saveAsFileName);
Response.Buffer = true;
Response.Clear();
Response.BinaryWrite(file);
Response.End();

// Return success
return new HttpStatusCodeResult(HttpStatusCode.OK);

Response是一个Controller属性,所以你不需要创建任何HttpResponseMessage对象。

于 2016-05-06T10:00:58.100 回答
1

有很多方法可以解决这个问题,但我会告诉你我的。您可以只执行 FileStreamResult 而不是 HttpResponseMessage。而且您不需要实例化 HttpResponseMessage,它已经是控制器方法的一部分。这就是我开始尝试修复您的代码的方式。请记住改用 FileStreamResult。

    public FileStreamResult DownloadExcel(???analystReport????)
    {
        MemoryStream memStream = ReportExporter.ExportReport(analystReport);

        return new FileStreamResult(memStream , "application/vnd.ms-excel", saveAsFileName);
    }
于 2016-05-06T11:17:34.190 回答