【发布时间】:2021-12-30 09:35:08
【问题描述】:
我想为来自外部 API 的文件编写导出/下载功能。 我已经为它创建了单独的动作。使用外部 API,我可以获得该文件的流。 当我将该流保存到本地文件时,一切都很好,文件不为空。
var exportedFile = await this.GetExportedFile(client, this.ReportId, this.WorkspaceId, export);
// Now you have the exported file stream ready to be used according to your specific needs
// For example, saving the file can be done as follows:
string pathOnDisk = @"D:\Temp\" + export.ReportName + exportedFile.FileSuffix;
using (var fileStream = File.Create(pathOnDisk))
{
await exportedFile.FileStream.CopyToAsync(fileStream);
}
但是当我返回包含stream 的exportedFile 对象并执行下一步时:
var result = await this._service.ExportReport(reportName, format, CancellationToken.None);
var fileResult = new HttpResponseMessage(HttpStatusCode.OK);
using (var ms = new MemoryStream())
{
await result.FileStream.CopyToAsync(ms);
ms.Position = 0;
fileResult.Content = new ByteArrayContent(ms.GetBuffer());
}
fileResult.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = $"{reportName}{result.FileSuffix}"
};
fileResult.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return fileResult;
导出的文件始终为空。
是流还是试图将该流作为文件返回的代码有问题?
尝试@Nobody 建议使用ToArray
fileResult.Content = new ByteArrayContent(ms.ToArray());
同样的结果。
也尝试使用StreamContent
fileResult.Content = new StreamContent(result.FileStream);
还是空文件。
但是当我使用StreamContent和MemmoryStream时
using (var ms = new MemoryStream())
{
await result.FileStream.CopyToAsync(ms);
ms.Position = 0;
fileResult.Content = new StreamContent(ms);
}
结果我得到了
{ “错误”:“服务器没有响应” }
注意:我从 3rd 方 API 获得只读流。
【问题讨论】:
-
为什么要改变 MemoryStream 的位置?
-
你确定流不是空的吗?您可以在调试时检查它在 MemoryStream 上调用 ToArray() 并检查流有一些非 0 字节
-
@kalit,是的,流不为空。该流可以成功保存到本地计算机上的文件中,但是在响应返回时-它是空的
-
请分享
exportedFile.FileStream的设置方式及其类型。另外,这个FileStream属性在分配给ByteArrayContent之前是否被读取/复制? -
@pfx 我正在使用 PowerBI API 从仪表板获取文件流docs.microsoft.com/en-us/power-bi/developer/embedded/… 一切都如示例...只是
ExportedFile对象转到调用该服务的 API 控制器。仅此而已。
标签: c# asp.net .net stream powerbi-embedded