Как предоставить fileDownloadName, только если пользователь запрашивает сохранение файла в ASP.NET MVC? - PullRequest
1 голос
/ 19 мая 2010

У меня есть действие контроллера, которое возвращает FileResult, подобный этому

return this.File("file.pdf", "application/pdf");

для URL "/ Download / 322" - где 322 - идентификатор файла.

Это прекрасно работает, так что если пользователь нажимает на ссылку на PDF - он открывается в веб-браузере, если у него установлен плагин PDF.

Но что, если они щелкнут правой кнопкой мыши по ссылке и выберут "Сохранить как ..."? Браузер всплывает с именем файла «322.» Я бы хотел иметь более подходящее имя файла, выполнив что-то вроде этого:

return this.File("file.pdf", "application/pdf", "file.pdf");

Но если я изменю контроллер так, чтобы он возвращался таким образом, он всегда будет всплывать в окне загрузки, поскольку MVC устанавливает заголовок Content-Disposition для вложения (поэтому я не могу встроить файл).

Итак, могу ли я как-то обнаружить, что пользователь пытается загрузить файл, а файл просто встраивается во что-то на странице?

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

Вы не можете определить, как браузер был настроен для обработки документа / содержимого.

Например, можно щелкнуть правой кнопкой мыши ссылку в документе HTML, выбрать «Сохранить ссылку как» / «Сохранить объект как» и загрузить файл. Ссылка может указывать на другой HTML-документ. Нет абсолютно никакого способа определить, произошло ли это.

Единственный прямой способ - указать «расположение содержимого» ответа как «вложение» с параметром «имя файла» с соответствующим значением.

Ваш HTML-ответ должен содержать следующие заголовки:

Content-Type: whatever/be-it
Content-Disposition: attachment; filename=FilenameToSaveAs.Ext

Пример:

Content-Type: text/html
Content-Disposition: attachment; filename=mypage.html

Если браузеры понимают эти заголовки - что сегодня большинство из них понимают, они откроют диалоговое окно «Открыть / Сохранить / Отменить».

Это похоже на «Скачать вложение» изображение в Gmail, которое в противном случае будет отображаться в самом браузере.

1 голос
/ 20 мая 2010

Отправка другого ответа ... форматирование coz не работает в комментариях.

Одна мысль пришла мне в голову ... об использовании JavaScript.

Для принудительного скачивания:

<a href='downloadFile.ext'
   onclick="alert('This file cannot be shown, right click, select Save Target As to download');
    return false'>
  Text for link</a>

Для просмотра или скачивания:

   <a href="simpleFile.ext">Text for Link</a>

Во втором случае пользователь может либо щелкнуть и позволить браузеру обрабатывать по умолчанию, либо щелкнуть правой кнопкой мыши и сохранить!

0 голосов
/ 19 мая 2010

Ну, подумав еще, я решил, что просто буду каждый раз указывать имя файла. Единственным недостатком является то, что он будет помечен как вложение и, следовательно, не будет загружаться в браузер (вместо этого пользователь будет загружать файл).

Кроме того, я не думаю, что вы можете сделать то, что я спрашиваю выше ... поэтому, если у кого-то нет других идей ... Я приму этот ответ.

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