gpt4 book ai didi

c# - 如何正确提供 PDF 文件

转载 作者:行者123 更新时间:2023-11-30 13:42:44 24 4
gpt4 key购买 nike

我正在使用 .NET 3.5 ASP.NET。目前我的网站以下列方式提供 PDF 文件:

context.Response.WriteFile(@"c:\blah\blah.pdf");

这很好用。但是,我想通过 context.Response.Write(char [], int, int) 方法提供服务。

所以我尝试通过

发送文件
byte [] byteContent = File.ReadAllBytes(ReportPath);
ASCIIEncoding encoding = new ASCIIEncoding();
char[] charContent = encoding.GetChars(byteContent);
context.Response.Write(charContent, 0, charContent.Length);

那没有用(例如,浏览器的 PDF 插件提示文件已损坏)。

所以我尝试了 Unicode 方法:

byte [] byteContent = File.ReadAllBytes(ReportPath);
UnicodeEncoding encoding = new UnicodeEncoding();
char[] charContent = encoding.GetChars(byteContent);
context.Response.Write(charContent, 0, charContent.Length);

这也没有用。

我错过了什么?

最佳答案

您不应该将字节转换为字符,这就是它变得“损坏”的原因。尽管 ASCII 字符以字节为单位存储,但实际的 ASCII 字符集仅限于 7 位。因此,使用 the ASCIIEncoding 转换字节流将有效地从每个字节中删除第 8 位。

字节应写入 the OutputStream Response 实例的流。

与其预先加载文件中的所有字节(这可能会消耗大量内存),不如从流中分块读取文件是一种更好的方法。以下是如何从一个流读取然后写入另一个流的示例:

void LoadStreamToStream(Stream inputStream, Stream outputStream)
{
const int bufferSize = 64 * 1024;
var buffer = new byte[bufferSize];

while (true)
{
var bytesRead = inputStream.Read(buffer, 0, bufferSize);
if (bytesRead > 0)
{
outputStream.Write(buffer, 0, bytesRead);
}
if ((bytesRead == 0) || (bytesRead < bufferSize))
break;
}
}

然后您可以使用此方法将文件的内容直接加载到 Response.OutputStream

LoadStreamToStream(fileStream, Response.OutputStream);

更好的是,这里有一个打开文件并将其内容加载到流中的方法:

void LoadFileToStream(string inputFile, Stream outputStream)
{
using (var streamInput = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
{
LoadStreamToStream(streamInput, outputStream);
streamInput.Close();
}
}

关于c# - 如何正确提供 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2169433/

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