2

我有一个小类,它接受来自包含文件上传的浏览器的 POST。我正在使用 StreamReader 来读取它。我读取了标题,然后当我到达正文时,我得到了内容长度并制作了一个该大小的数组,然后stream.ReadBlock()是:

char[] buffer = new char[contentLength];
stream.ReadBlock(buffer, 0, contentLength);
String body = new string(buffer);

当我运行它并发布一个文本文件时,它工作正常。但是,我尝试了 ZIP 文件和 MP3 文件,但这些都不起作用。它只是挂断stream.ReadBlock()电话。

我首先在带有 Mono 2.6.7 的 Ubuntu 10.04 上尝试了这个(我的 MonoDevelop 项目设置为使用 .net 3.5)。我刚刚通过在 VisualStudio 2010 和 .net 3.5 中运行相同的项目验证了在 Windows7 上发生了同样的事情。我试过从 Firefox 和 Chrome 发布。

任何人都知道为什么会发生这种情况?谢谢。

我还尝试使用 BinaryReader 而不是 StreamReader:

byte[] bytes = reader.ReadBytes(contentLength);

但无论现在如何,它最终都会挂在那个电话上。是因为我使用 StreamReader 读取 POST 的标题,然后使用 BinaryReader 读取正文吗?

4

2 回答 2

4

StreamReader用于文本数据。您不应该在二进制数据上使用它 - 您应该使用BinaryReader或只使用Stream.

于 2010-08-18T20:04:15.013 回答
1

使用 StreamReader 不适合二进制文件。它会做各种各样的文本编码工作,并且通常(可能)搞砸。

一旦您确定您正在使用的文件是二进制文件,您应该直接使用 Stream 对象来读取(部分)文件。这样,您就不必处理混淆内容的编码。

于 2010-08-18T20:05:12.050 回答