stream - 如果使用 MemoryStream 而不是 FileStream,则 HttpResponseMessage 始终为空
问题描述
我想创建一个流本地文件的 HttpResponse。我想使用 MemoryStream,以便之后可以删除文件(实际上是在返回响应之前)。尽管流似乎是有效的,但我总是得到一个空响应。不过,在 API Controller 中使用 FileStream 是可行的。
public HttpResponseMessage GetExcelFile(Guid id)
{
// this model is needed to internally create an .xls file that represents this model
var exportModel = this.myService.GetExport(id);
// this approach does not work -> respone always empty although memory stream has content
// var stream = new MemoryStream();
// internally creates a .xls file (using lib) and returns its content as memory stream
// this.myService.ConvertToStream(exportModel, stream));
// this works fine
var stream = File.OpenRead(@"D:\test0815.xls");
var result = this.Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = stream.Length;
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = $"{exportModel.Name}-Sheet.xls"
};
return result;
}
这是我实际转换为内存流的方法:
private MemoryStream SaveToStream(MemoryStream stream)
{
using (FileStream source = File.Open(
@"D:\test0815.xls",
FileMode.Open))
{
Console.WriteLine("Source length: {0}", source.Length.ToString());
// Copy source to destination.
source.CopyTo(stream);
}
return stream;
}
我也尝试写入内存流,但这也不起作用。似乎这result.Content = new StreamContent(stream);
不适用于内存流。
有任何想法吗?
解决方案
最后我找到了一个可行的解决方案:
var memoryStream = new MemoryStream((int)fileStream.Length);
fileStream.CopyTo(memoryStream);
fileStream.Close();
memoryStream.Seek(0, SeekOrigin.Begin);
HttpContent content = new StreamContent(memoryStream);
var result = this.Request.CreateResponse(HttpStatusCode.OK);
result.Content =content;
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
推荐阅读
- html - 如何将多个 GeoJSON 图层添加到传单地图?
- java - Cardview onclick 事件不适用于 clickable=true
- assembly - 将汇编代码与 nasm 链接后,链接器出现分段错误
- python - 嵌套字典中的总和值 - Python
- python - pandas:如何将方法添加到您未定义的类中?
- typescript - TypeScript 和 GraphQL jwt 刷新令牌和黑名单
- javascript - 用 redux 将 componentDidUpdate(prevProps) 重写为 hook
- c# - MachineKey 在 ASP.NET 身份数据库表中起什么作用?
- python - “list_display”可以在 django 管理页面上显示用户输入吗?
- javascript - 达到一定值后如何反转该正方形的方向?