2013-08-08 3 views
0

У меня есть небольшое приложение asp.net, которое позволяет пользователям загружать вложения, а через asp: linkbutton загружать их с другого экрана. в IE10, когда я нажимаю на ссылку, чтобы загрузить загруженный файл, IR показывает диалог открытия, сохранения, отмены, но вместо URL-адреса отображается URL-адрес. В сафари и firefox этого не происходит. это сводит меня с ума. Я пробовал все виды заголовков/типов контента, комбинаций контента без везения. ниже - фрагмент моего кода, который работает в firefox и safari - он просто записывает двоичный код в ответ.ASP.NET проблема с IE10 открытие файлов, хранящихся на сервере sql DB

Dim bytes() As Byte = CType(dt.Rows(0)("UploadedFiles"), Byte()) 
Response.Clear() 
Response.ClearHeaders() 
Response.ClearContent() 
Response.AddHeader("Content-Disposition", "attachment;filename=" & Chr(34) & 
dt.Rows(0) ("FileName").ToString & Chr(34)) 
Response.Buffer = True 
Response.Cache.SetCacheability(HttpCacheability.NoCache) 
Response.ContentType = dt.Rows(0)("ContentType").ToString() 
Response.BinaryWrite(bytes) 
Response.Flush() 
Response.Close() 
Response.End() 
+0

Так что просто подтвердить 'filename =' часть не работает? Он не отображает правильное имя файла для «Сохранить как»? –

+0

правильно, он показывает диалог открытия/сохранения/отмены, но мое имя файла с параметром querystring отображается вместо имени файла. из-за этого IE не может открыть файл. firefox и сафари работают нормально. – user2665493

+0

Я думаю, что кэширование может быть проблемой. Можете ли вы попробовать «Response.Cache.SetCacheability (HttpCacheability.Public)» вместо этого, а также добавить «Response.AddHeader» («прагма», «public») '? –

ответ

0

Это, как я это делаю, это работает в IE8, жаль, что я не имеют IE10 установлены для тестирования:

// myFile = an object containing information about the file being served 
Response.Clear() 
Response.Cache.SetExpires(DateTime.Now.AddMonths(1)) 
Response.Cache.SetCacheability(HttpCacheability.Public) 
Response.ContentType = myFile.contentType 
Response.AddHeader("Content-Disposition", "attachment; filename=" & myFile.targetFilename) 
Response.BinaryWrite(bytes) // your code 
//Response.WriteFile(myFile.sourceFilename, True) // my code 
Response.End() 

Материал кэширования, вероятно, не нужно.

Я использую Response.WriteFile, потому что я сохранил свои файлы в файловой системе, а не в массиве базы данных/байта. Вы можете просто добавить свой звонок в BinaryWrite.

Единственное другое отличие - это двойные кавычки вокруг имени файла в заголовке Content-Disposition. Я знаю, что это rfc2616, но мой код работает без них.

+0

Спасибо Уолтеру, я просто попробовал это, и он дал ошибку. WriteFile ожидает физический файл, который в моем случае не существует. Я тоже пробовал и без кавычек в имени файла. Я бы предпочел не переписывать этот модуль для хранения файлов в файловой системе, но мне может потребоваться :( – user2665493

+0

Правильно, 'WriteFile' ожидает строку, содержащую путь к физическому файлу. Что произойдет, если вы используете мой код, за исключением замены мой 'WriteFile' с вашим' BinaryWrite'. Я не понимаю, почему вам нужно переключиться на файловую систему, я думаю, что это просто проблема правильного написания вашего HTTP-ответа. –

+0

, который дает тот же результат. конечно, если вы видите мой комментарий выше, но одно замечание, мой первоначальный код работает с IE в режиме отладки, но когда я скомпилирую в режим выпуска и попытаюсь локально (или на сервере), он возвращает имя страницы вместо имени файла – user2665493