gpt4 book ai didi

c# - Angular/Web API 2 使用 StreamContent 或 ByteArrayContent 返回无效或损坏的文件

转载 作者:太空狗 更新时间:2023-10-29 21:21:33 24 4
gpt4 key购买 nike

我试图在 ASP.NET Web API Controller 中返回一个文件。此文件是保存在 MemoryStream 中的动态生成的 PDF。

客户端(浏览器)成功接收到文件,但打开文件时,发现所有页面都是一片空白。

问题是,如果我采用相同的 MemoryStream 并将其写入文件,则此磁盘文件会正确显示,因此我认为问题与通过 Web 传输文件有关。

我的 Controller 看起来像这样:

[HttpGet][Route("export/pdf")]
public HttpResponseMessage ExportAsPdf()
{
MemoryStream memStream = new MemoryStream();
PdfExporter.Instance.Generate(memStream);

memStream.Position = 0;
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(memStream.ToArray()); //OR: new StreamContent(memStream);
return result;
}

只是尝试一下,如果我将流写入磁盘,它会正确显示:

[HttpGet][Route("export/pdf")]
public HttpResponseMessage ExportAsPdf()
{
MemoryStream memStream = new MemoryStream();
PdfExporter.Instance.Generate(memStream);

memStream.Position = 0;
using (var fs = new FileStream("C:\\Temp\\test.pdf", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
memStream.CopyTo(fs);
}

return null;
}

区别是:

  • 保存在磁盘上的 PDF:34KB
  • 通过网络传输的 PDF:60KB (!)

如果我比较两个文件的内容,主要区别是:

File Differences

左边是网页传输的PDF;在右侧,保存到磁盘的 PDF。

我的代码有问题吗?也许与编码有关?

谢谢!

最佳答案

嗯,原来是客户端(浏览器)的问题,不是服务器的问题。我在前端使用 AngularJS,因此当收到响应时,Angular 会自动将其转换为 Javascript 字符串。在那次转换中,文件的二进制内容以某种方式被改变了......

基本上它是通过告诉 Angular 不要将响应转换为字符串来解决的:

$http.get(url, { responseType: 'arraybuffer' })
.then(function(response) {
var dataBlob = new Blob([response.data], { type: 'application/pdf'});
FileSaver.saveAs(dataBlob, 'myFile.pdf');
});

然后在 Angular File Saver 的帮助下将响应保存为文件服务。

关于c# - Angular/Web API 2 使用 StreamContent 或 ByteArrayContent 返回无效或损坏的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com