2008-12-03 5 views
6

У меня есть база данных sql, в которой хранятся некоторые документы.C# ASP.NET 3.5 проблемы с загрузкой содержимого файлов

Пользователь может войти в приложение и просмотреть список своих документов.

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

System.IO.FileInfo file = new System.IO.FileInfo(System.Configuration.ConfigurationManager.AppSettings["UploadPath"] + DocumentName); 

    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.Cookies.Clear(); 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.CacheControl = "private"; 
    Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
    Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 
    Response.AppendHeader("Content-Length", file.Length.ToString()); 
    Response.AppendHeader("Pragma","cache"); 
    Response.AppendHeader("Expires", "60"); 
    Response.ContentType = GetContentType(file.Extension); 
    Response.AppendHeader("Content-Disposition", 
    "inline; " + 
    "filename=\"" + file.Name + "\"; " + 
    "size=" + file.Length.ToString() + "; " + 
    "creation-date=" + DateTime.Now.ToString("R") + "; " + 
    "modification-date=" + DateTime.Now.ToString("R") + "; " + 
    "read-date=" + DateTime.Now.ToString("R")); 

Мои GetContentType() просто возвращает соответствующий тип файла для файлов я позволяю «приложение/PDF, приложение/msw0rd и т.д.

Моя проблема заключается в том, что, когда файл будет сохранен, это сама веб-страница, а не файл из файловой системы. И в google chrome он помещает расширение .htm в конец имени файла, я думаю, потому что он знает, что это веб-страница?

Во всяком случае, отличный первый шагом было бы получить фактический файл, а не копию веб-страницы в HTML, на которой они сидят!

Спасибо.

ответ

9

Как вы посылаете фактическое содержимое файла ??

I обычно используют метод Response.TransmitFile, он в основном открывает файл и отправляет его содержимое в Response.OutputStream

3

Пробовал ли вы настройку содержания на «привязанность», а не «встроенную»? Я считаю, что браузер затем предложит пользователю открыть или сохранить документ.

Кроме того, вы можете обычно обходить файловую систему, записывая поток байтов из базы данных непосредственно в объект Response с помощью метода BinaryWrite ... Это также случай, когда вы можете исследовать с помощью обработчика HTTP вместо этого страницу ASPX, так что вам не нужно беспокоиться об очистке ответа и т. д. У меня был успех в прошлом с использованием скрытого iframe на странице, а затем с помощью Javascript для установки его src в обработчик HTTP, который берет документ ID в качестве параметра в QueryString.

9

Вместо

Response.AppendHeader ("Content-Disposition", "встроенный;" + "имя_файла =

использование

Response.AddHeader (" Content-Disposition:», «прикрепление; имя файла =