2012-03-07 1 views
6

Так я возвращаюсь в FileContentResult из действия, как это:«Файл не может быть загружен» в Internet Explorer с помощью ASP.NET MVC

return File(pck.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MyExcelFile.xlsx"); 

При щелчке по «Open» в IE (я используя IE9, версия 9.0.8112.16421), он говорит, что «Файл не может быть загружен», и пользователю предоставляется кнопка «Повторить». Если они нажмут «Повторить», он будет работать нормально. Если они нажмут «Сохранить», все будет хорошо. В Firefox он отлично работает.

Как я могу разрешить пользователю открывать файл при нажатии кнопки «Открыть в первый раз»?

+0

какая версия есть? – Joe

+0

Я обновил вопрос. –

+0

Установите скрипт и запускайте его, когда вы делаете первый запрос. Вы сможете проверить ответ, возвращаемый с сервера. Возможно, это прояснит проблему. http://www.fiddler2.com/fiddler2/ – Joe

ответ

2

Я смог «обмануть» IE в правильном направлении, изменив URL. Это хакеры, но вот детали. НТН.

Как хороший MVC-кодер, я использовал Url.Action() для создания правильной ссылки в моем представлении для моего действия с контроллером. Результатом было «/ Subscription/DownloadArchive», и у меня была такая же проблема. (Я передаю ZIP-файл вниз, но, похоже, не отличается от вашего CSV.) По прихоти только сейчас, прочитав сообщение, я жестко закодировал URL-адрес «/Subscription/DownloadArchive/Archive.zip». Я игнорирую «Archive.zip» в коде, но на самом деле это имя файла, которое я возвращаю из действия моего контроллера.

Presto!

0

У меня была такая же проблема, но если бы я изменил номер порта Visual Studio Development Server на другой, эта проблема исчезла.

2

У меня такая же проблема, и я не могу предложить хорошее решение (помимо того, что предлагает Tood, - вариант). Но, глядя на ситуацию со скрипачом &, у меня есть дополнительная информация, которая может быть полезной.

Наше приложение создает документы PDF на лету и предлагает их в качестве загрузок. Проблема явно зависит от данных, а это означает, что некоторые сгенерированные файлы загружаются с первой попытки, в то время как другие воспроизводимо нуждаются в повторной попытке.

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

Первый запрос:

GET http://localhost:12345/Item/PDF/id HTTP/1.1 
Accept: text/html, application/xhtml+xml, */* 
Referer: ... 
Accept-Language: ... 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Accept-Encoding: gzip, deflate 
Host: localhost:12345 
Connection: Keep-Alive 
Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4 

Второй запрос:

GET http://localhost:12345/Item/PDF/id HTTP/1.1 
Accept: */* 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Host: localhost:12345 
Connection: Keep-Alive 
Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4 

Обратите внимание, как второй запрос уменьшает 'Accept:' заголовок просто */*. Причина, по которой я неохотно добавляю расширение файла к Url, заключается в том, что предлагаемое имя загрузки создается из данных элемента, отправляется с ответом и в противном случае полностью не связано с идентификатором.

+0

Да, это очень интересно. Я должен вернуться к этому и сделать второй взгляд. –

+0

Я столкнулся с той же проблемой с IE 11. Я вижу те же результаты в Fiddler. Мой процесс состоял в том, чтобы открыть текстовый файл из локальной системы и отредактировать его или создать его с нуля. Лучшим обходным решением, которое я мог бы придумать, было добавить временную метку к имени файла, например 'filename.timestamp.txt', и после этого он работал отлично. – JabberwockyDecompiler

0

это работает ..

Response.Clear(); 
Response.ClearHeaders(); 
Response.ClearContent(); 
Server.ScriptTimeout = 3000; 
Response.AppendHeader("Content-Disposition:", "attachment; filename=" + fileName); 
Response.ContentType = "application/x-msdownload"; 
excelFile.SaveXls(Response.OutputStream); 
Response.Flush(); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 
// Response.Close(); 
Response.End(); 
Смежные вопросы