上传并转换为字节数组后,为什么我的文件大小不同?

3
我正在使用以下代码从HttPostedFileBase对象中获取字节数组:
byte[] mobileAppByteArray = default(byte[]);
using (MemoryStream ms = new MemoryStream())
{
  httpPostedFileObject.InputStream.CopyTo(ms);
  mobileAppByteArray = ms.GetBuffer();
}

httpPostedFileObject的原始大小是3191KB,但在进行上述转换并保存到磁盘后,文件大小为4096KB。

我知道CopyTo的默认缓冲区大小是4096,但即使我将缓冲区大小更改为1024,结果仍然相同:文件大小为4096KB。

我该如何更改代码以便在保存到磁盘后文件仍保持为3191KB?

1个回答

5

这是因为 GetBuffer 方法返回整个基础缓冲区,而不仅仅是已经从输入流中填充了字节的部分。建议使用 ToArray 方法代替:

mobileAppByteArray = ms.ToArray();

太好了,谢谢!只有一个问题:链接的文档似乎对ToArray有一个警告“然而,ToArray会在内存中创建数据的副本。”这是个问题吗?是否有任何解决方法?GetBuffer获取对底层缓冲区的引用,那么有没有办法获取缓冲区的“已使用”部分的引用? - TheFabledOne
1
@TheFabledOne 不完全是这样。CopyTo 只会复制数组中使用过的部分,而 Length 属性则会告诉你数组中有多少部分被使用了,但在这两种情况下,你可能需要改变如何使用内存流。如果你想要获取一个仅表示缓冲区已使用部分的数组,那么 ToArray 就是它。 - p.s.w.g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接