Не следует конвертировать байты в символы, поэтому он становится «поврежденным».Даже если символы ASCII хранятся в байтах, фактический набор символов ASCII ограничен 7 битами.Таким образом, преобразование потока байтов с помощью ASCIIEncoding эффективно удалит 8-й бит из каждого байта.
Байты должны быть записаны в поток 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();
}
}