ASP.NET MVC: можно ли вернуть файл MSI через FileContentResult, не нарушая установочный пакет? - PullRequest
4 голосов
/ 04 марта 2010

Я использую этот код для возврата FileContentResult с файлом MSI для загрузки пользователем в мой ASP.NET MVC контроллер:

using (StreamReader reader = new StreamReader(@"c:\WixTest.msi"))
{
    Byte[] bytes = Encoding.ASCII.GetBytes(reader.ReadToEnd());

    return File(bytes, "text/plain", "download.msi");
}

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

Этот установочный пакет не может быть открыт. Связаться с поставщиком приложения чтобы убедиться, что это действительная Windows Пакет установщика.

Я знаю, что проблема не в C: \ WixTest.msi, потому что он работает нормально, если я использую локальную копию. Я не думаю, что я использую неправильный тип MIME, потому что я могу получить что-то похожее, просто используя File.Copy и возвращая скопированный файл через FilePathResult (без использования StreamReader), который действительно работает после загрузки.

Мне нужно использовать FileContentResult, однако, чтобы я мог удалить копию файла, который я делаю (что я могу сделать, как только я загрузил его в память).

Мне кажется, я делаю недействительным установочный пакет, копируя или кодируя файл. Есть ли способ прочитать файл MSI в память и вернуть его через FileContentResult, не повредив установочный пакет?

Решение:

using (FileStream stream = new FileStream(@"c:\WixTest.msi", FileMode.Open))
{
    BinaryReader reader = new BinaryReader(stream);
    Byte[] bytes = reader.ReadBytes(Convert.ToInt32(stream.Length));

    return File(bytes, "application/msi", "download.msi");
}

1 Ответ

3 голосов
/ 04 марта 2010

Попробуйте использовать двоичное кодирование и тип содержимого application/msi вместо text/plain - это не ASCII или текстовое содержимое, поэтому вы искали файл.

...