Возвращение файла из байта [] не работает правильно в MVC 3 - PullRequest
2 голосов
/ 04 октября 2011

Я недавно опубликовал вопрос, спрашивающий, как я могу вернуть файл из байта [], который я храню.

Вопрос здесь byte [] к типу файла в MVC 3

Просто для справки, я привел к сохранению двоичного файла для файла в виде строки.

Когда я возвращаю документ, я звоню по следующему коду:

var data = document.BinData.ToByteArray();
return File(data, document.MIMEType,document.Extension);

, где BinData - строка, а ToByteArray () - метод расширения, который я написал:

public static byte[] ToByteArray(this string data)
    {
        byte[] binData= new byte[data.Length];
        for (var i = 0; i < data.Length; i++)
        {
            binData[i] = (byte)data[i];
        }
        return binData;
    }

Проблема, с которой я сталкиваюсь, заключается в том, что когда я возвращаю файл, я получаю что-то вроде следующего:

enter image description here

Есть ли что-нибудь, что вы видите, что я делаю неправильно?

Редактировать , я изменил следующий код «Загрузить» на следующий:

var stream = BinData.InputStream;
                byte[] data = new byte[BinData.ContentLength];
                stream.Read(data, 0, BinData.ContentLength);

                string documentData = Convert.ToBase64String(data);

где documentData - строка, которую я храню:

и код загрузки следующий:

var data = Convert.FromBase64String(document.BinData);
return File(data,document.MimeType,document.Title + document.Extension);

где document.BinData - это данные документа сверху

1 Ответ

2 голосов
/ 04 октября 2011

Держу пари, что проблема в строке:

Просто для справки, я привел к сохранению двоичного файла для файла в виде строки.

Исходя из вашего декодера (ToByteArray), это не совсем правильно закодировано;нота;Вы не можете рассматривать произвольные двоичные данные как строку (по крайней мере, не так, как вы пытаетесь).Предпочтительный способ сделать это просто:

byte[] originalData = ...
string asString = Convert.ToBase64String(originalData);
byte[] reconstructedBinary = Convert.FromBase64String(asString);

(хотя несколько других подходов - например, hex) тоже сработают)

Это должно вернуть вам правильный byte[], иоттуда все должно быть хорошо.


Перечитайте ваш код Stream.Read и, если у вас уже есть какая-то проверка длинны для предотвращения DDOS, обратите внимание, что вы должны loop на Read:

int remaining = BinData.ContentLength, offset = 0, bytesRead;
byte[] data = new byte[remaining];
while((bytesRead = stream.Read(data, offset, remaining)) > 0) {
    offset += bytesRead;
    remaining -= bytesRead;
}
if(remaining > 0) throw new EndOfStreamException();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...