IIS сервер не отдаёт файл

3511
12 февраля 2020, 22:10

На IIS Express все работает отлично. Переношу на сервер - при попытке скачать файл пишет "Не удалось скачать". Хотя физически он в папке inetpub есть. Права пользователю IUSRS дал полные на папку inetpub

var date = DateTime.Parse(model.Date).ToString("dd.MM.yyyy h:MM:ss");
string newstring = client.HelloBaza(normalUser, date);
System.IO.File.WriteAllBytes(Server.MapPath("~/"+normalUser+".xlsx"), Convert.FromBase64String(newstring));
string filepath = Server.MapPath("~/" + normalUser + ".xlsx");
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = MimeMapping.GetMimeMapping(filepath);
var cd = new System.Net.Mime.ContentDisposition
{
    FileName = normalUser + ".xlsx",
    Inline = true,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(filedata, contentType);
Answer 1

Рассмотрю несколько случаев.

  • Кажется не первый раз спрашивают как сгенерировать файл "на лету" приведу пример

     Response.Clear();
     Response.ContentType = "application/vnd.ms-excel";
     Response.AppendHeader("Content-Disposition", 
     "attachment; filename="+normalUser + ".xlsx");
     Response.Write(filedata); // filedata  - массив байт
     Response.End();
    

Список ContentType тут

  • Часто генераторы умеют работать с Stream, тогда запись будет примерно такой

    DataTable dt = new DataTable(); // Например      
     Response.Clear();
     Response.ContentType = "text/xml";
     Response.AppendHeader("Content-Disposition", 
     "attachment; filename="+normalUser + ".xml");
     dt.WriteXml(Response.OutputStream);
     Response.End();
    
  • Если нужно передать файл (пробросить с подменой имени или без), то это делается так Передача файла

  • Если нужно просто дать добро на скачивание файлов с определенным разширением с папки, то нужно просто в web.config дописать Copy-обработчик

    <configuration>
    <system.web>
    <compilation>
      <buildProviders>
        <add extension=".xlsx" 
        type="System.Web.Compilation.ForceCopyBuildProvider" />
      </buildProviders>
    

    Разрешение можно дать как для определенного каталога (рекомендуется), так и для всего пула (так проще).

READ ALSO
Как создать файл в директории

Как создать файл в директории

Я в программе узнаю директорию в какой расположен исполняемый файл программы, как создать в ней текстовый файл?

3421
Сохранение и загрузка массива Дат

Сохранение и загрузка массива Дат

Как правильно осуществлять сохранение и загрузку массива дат DateTime? Сейчас я осуществляю сохранение массива вот такПравильно ли я делаю...

3722
Контроль одного экземпляра приложения C# в Linux

Контроль одного экземпляра приложения C# в Linux

Пытаюсь адаптировать виндовое C# WinForm приложение для работы в LinuxВ Linux установлено Mono, т

3395
Обратиться к открытому процессу (process)

Обратиться к открытому процессу (process)

Как обратиться к уже запущенному на компьютере процессу, прочитать линию или подать новую командуДопустим на компьютере запущен Process

3382