Приложение может найти папку «Загрузки» при отладке, но не в IIS - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть приложение, которое позволяет пользователю загружать файл (сохраняя его в папке, расположенной в wwwroot приложения ASPNETCORE). Отсюда они могут вносить в него изменения, а затем они могут выбрать экспорт файла в виде файла csv / xml / xlsx, который загружает файл в папку пользователя "downloads".

При отладке в Visual Studio все это работает Однако, хорошо, когда я публикую sh и внедряю приложение в IIS, я получаю исключение

Ошибка сохранения файла C: \ windows \ system32 \ config \ systemprofile \ Downloads (ИМЯ ФАЙЛА)

Не удалось найти часть пути C: \ windows \ system32 \ config \ systemprofile \ Downloads (ИМЯ ФАЙЛА)

Это текущий способ получения папки загрузок :

FileInfo file = new FileInfo(Path.Combine(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\Downloads"), data.Filename + "." + data.FileType));

Однако я также попробовал решение, на которое Ганс Пассант ответил на аналогичный вопрос здесь . Оба решения работают нормально при локальной отладке, однако, как только я опубликую их sh, это выдает исключение:

Значение не может быть нулевым. Имя параметра: path1

Который, как я полагаю, выдается здесь, когда я пытаюсь сохранить файл в папке загрузки пользователя.

using (var package = new ExcelPackage(file))
{
    var workSheet = package.Workbook.Worksheets.Add("ExportSheet");
    workSheet.Cells.LoadFromCollection(exports, true);
    package.Save();
}

Я не знаю точно как я мог бы воспроизвести эти исключения, видя, как локально, с помощью Visual Studio все это прекрасно работает.

Кто-нибудь еще сталкивался с этой проблемой при попытке загрузить файл?

ОБНОВЛЕНИЕ: Когда приложение работает на IIS, кажется, что оно использует его как профиль пользователя, а не как пользователя, поэтому при попытке перейти в папку «Загрузки» оно не может найти его. Как я могу заставить его использовать профиль пользователя?

LoadUserProfile уже установлено в True.

1 Ответ

0 голосов
/ 17 апреля 2020

Веб-приложения не знают файловой системы компьютера конечного пользователя!

Таким образом, использование Environment.GetFolderPath или Environment.ExpandEnvironmentVariables в коде на стороне сервера покажет только серверные пользовательские (то есть Windows Service Identity) каталоги профилей, которые полностью отделены и отличаются от фактического пользовательского профиля пользователя ОС на основе браузера.

В качестве простого мысленного эксперимента: рассмотрим пользователя, использующего странный инопланетный веб-браузер в еще более инопланетной операционной системе (скажем, iBrowse для Amiga !) - концепция Windows - Директории оболочки «Загрузки» просто не существует, и все же вот они, просматривая ваш сайт. Что вы ожидаете , что ваш код будет делать в этой ситуации?

Чтобы "загрузить" файл для пользователя, ваше серверное веб-приложение должно обслуживать необработанные байты сгенерированного файла. (например, используя HttpResponse.TransmitFile) с заголовком Content-Disposition: , чтобы предоставить подсказку браузеру пользователя, что он должен сохранить файл, а не пытаться открыть это в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...