尝试使用预定义的块大小并按数据块读取文件。然后您可以使用每个块中的数据并使用它。如果您需要将整个文件作为 Base64 发布,那么按块读取它不会改变它太长的事实,如果这是问题的话。
int chunkSize = 1024;
string source = @"file.accdb";
BinaryReader rdr = new BinaryReader(new FileStream(source, FileMode.Open));
int streamLength = (int)rdr.BaseStream.Length;
while (rdr.BaseStream.Position < rdr.BaseStream.Length)
{
byte[] b = new byte[chunkSize];
long remaining = rdr.BaseStream.Length - rdr.BaseStream.Position;
if(remaining >= chunkSize)
{
rdr.Read(b, 0, chunkSize);
}
else
{
rdr.Read(b, 0, (int)remaining);
}
string chunkString = Convert.ToBase64String(b);
// .. do something with the chunk of data, write to a stream, etc
}
编辑:我已经在您的场景中对此进行了测试,阅读了您通过默认 Windows 安装获得的野生动物视频,并将它们写入带有字节的文件中,并且还使用 Base64 编码的字符串,例如你正在做,两个测试都OK,我可以在这两种情况下毫无问题地播放视频,所以阅读的方法应该不是这里的问题。我已经提供了我用于测试的方法。如果问题仍然存在,请尝试上传一个小文件并验证发送的内容是否与您的 Web 服务正在获取和保存的内容相匹配。我认为问题可能是我在下面的评论中描述的,暗示 C# 和 Java 对待 Base64 有点不同。
StringBuilder acc = new StringBuilder();
int chunkSize = 2187;
string source = @"Wildlife.wmv";
BinaryReader rdr = new BinaryReader(new FileStream(source, FileMode.Open));
while (rdr.BaseStream.Position < rdr.BaseStream.Length)
{
byte[] b = new byte[chunkSize];
long remaining = rdr.BaseStream.Length - rdr.BaseStream.Position;
if (remaining >= chunkSize)
{
rdr.Read(b, 0, chunkSize);
}
else
{
rdr.Read(b, 0, (int)remaining);
}
acc.Append(Convert.ToBase64String(b));
}
FileStream fs = new FileStream(@"c:\dev\test.wmv", FileMode.OpenOrCreate);
fs.Write(Convert.FromBase64String(acc.ToString()),0,0);
Process.Start(@"c:\dev\test.wmv");