У меня есть база данных sql, в которой хранятся некоторые документы.
Пользователь может войти в приложение и просмотреть список своих документов.
При нажатии на ссылку загрузки в сетке их документов я получаю файл из базы данных, записываю его в файловую систему, а затем выполняю этот код.
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 () просто возвращает соответствующий тип файла для разрешенных мной файлов: application / pdf, application / msw0rd и т. д.
Моя проблема в том, что когда файл сохраняется, это сама веб-страница, а не файл из файловой системы. А в google chrome он помещает расширение .htm в конец имени файла, я думаю, потому что он знает, что это веб-страница?
В любом случае, отличным первым шагом было бы получить фактический файл, а не копию веб-страницы в HTML, на которой они сидят!
Спасибо.





Вы пробовали установить для content-disposition значение «привязанность», а не «встроенный»? Я считаю, что тогда браузер предложит пользователю открыть или сохранить документ.
Кроме того, обычно вы можете обойти файловую систему, записав свой поток байтов из базы данных непосредственно в объект Response с помощью метода BinaryWrite ... Это также тот случай, когда вы можете захотеть исследовать использование HTTP-обработчика вместо на странице ASPX, чтобы что вам не нужно беспокоиться об очистке ответа и т. д. В прошлом мне удавалось использовать скрытый iframe на странице, а затем использовать Javascript для установки его src в обработчик HTTP, который принимает идентификатор документа в качестве параметра на QueryString.
Вместо
Response.AppendHeader ("Content-Disposition", "встроенный;" + "filename =
использовать
Response.AddHeader ("расположение-содержимого:", "вложение; имя файла =
Как вы отправляете фактическое содержимое файла?
Я обычно использую метод Response.TransmitFile, он в основном открывает файл и отправляет его содержимое в Response.OutputStream.