Принудительная загрузка файла на веб-сервере – ASP.NET C #

Мне нужно принудительно инициировать загрузку файла .sql, когда пользователь нажимает кнопку в моем веб-приложении на ASP.NET (C #).

Как и в случае нажатия кнопки, диалог сохранения должен открываться на стороне клиента …

Как мне это сделать?

РЕДАКТИРОВАТЬ

Это код, который я использую

string sql = ""; using (System.IO.StreamReader rdr = System.IO.File.OpenText(fileName)) { sql = rdr.ReadToEnd(); } Response.ContentType = "text/plain"; Response.AddHeader("Content-Disposition", "attachment; filename=Backup.sql"); Response.Write(sql); Response.End(); 

Это ошибка, которую я получаю …

alt text http://img40.imageshack.us/img40/2103/erroro.gif

Что не так?

Создайте отдельный обработчик HTTP (https://stackoverflow.com/questions/873207/force-download-of-a-file-on-web-server-asp-net-c-sharp/DownloadSqlFile.ashx):

 <%@ WebHandler Language="C#" Class="DownloadHandler" %> using System; using System.Web; public class DownloadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { var fileName = "myfile.sql"; var r = context.Response; r.AddHeader("Content-Disposition", "attachment; filename=" + fileName); r.ContentType = "text/plain"; r.WriteFile(context.Server.MapPath(fileName)); } public bool IsReusable { get { return false; } } } 

Затем сделайте кнопку на странице ASP.NET, чтобы перейти к https://stackoverflow.com/questions/873207/force-download-of-a-file-on-web-server-asp-net-c-sharp/DownloadSqlFile.ashx .

Вы должны сообщить браузеру, что то, что вы отправляете, не является html и не должно отображаться как таковое в браузере. Следующий код может быть использован для возврата некоторого текста в код на стороне сервера, и он предоставит пользователю диалоговое окно сохранения, которое вам нужно:

 Response.Clear(); //eliminates issues where some response has already been sent Response.ContentType = "text/plain"; Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); Response.Write(yourSQL); Response.End(); 

filename : имя, которое вы хотите дать

yourSQL : содержимое файла sql

Проблема в том, что вы используете код на той же странице, что и в настоящее время загружается в браузере. Вы пытаетесь изменить stream ответов и расположение текущей загруженной страницы. Вместо этого создайте отдельный HttpHandler, как это предложил Мехрдад. Затем, нажав кнопку, вы вызовете URL-адрес обработчику. Кнопка может быть даже простой гиперссылкой, в которой исходный URL имеет следующее:

 Download SQL 

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

Добавьте Response.Clear перед Response.Write чтобы исправить ошибку, если она правильно указана в диалоговом окне Chrome.

Итак, чтобы интегрировать в fragment в другом ответе …

 //add this Reponse.Clear(); //from other answer Response.ContentType = "text/plain"; Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); Response.Write(yourSQL); Response.End; 

Решение ниже работает для меня

 string fileNameAndExtension = "thisFile.pdf"; string fullPath = "../folder/files/" + fileNameAndExtension; Response.Clear(); Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension ); Response.TransmitFile(fullPath); Response.End(); 
  • Загрузите несколько файлов с помощью одного действия
  • Открыть текстовый файл в текстовом редакторе по умолчанию ... через Java?
  • Что означает код состояния HTTP 0
  • ANDROID: Как загрузить видеофайл на SD-карту?
  • Загрузите файл и сохраните его автоматически.
  • Возврат файла для просмотра / загрузки в ASP.NET MVC
  • Загрузка большого файла - iPhone SDK
  • ICEfaces libary в пути к classам предотвращает всплывающее диалоговое окно «Сохранить как» при загрузке файла
  • Как загрузить видеофайл на SD-карту?
  • Загрузка изображений с помощью node.js
  • Android написать в папку sd card
  • Interesting Posts

    Как установить и использовать ASP.NET AJAX Control Toolkit в моих веб-приложениях .NET 3.5?

    URL-сопоставление с C # HttpListener

    чтение двух целых чисел в одной строке с использованием C #

    В чем разница между переопределением виртуальных функций и скрытием не виртуальных функций?

    Графическое изображение пользователя Facebook не будет отображаться на мобильных устройствах

    Выдача результата для float в методе, возвращающем результат изменения float

    Как импортировать файл excel в базу данных MySQL

    Как я могу сделать один файл python другим?

    Есть ли способ иметь nested числовое поле ввода?

    Почему каждый объект в Java неявно расширяет class java.lang.Object?

    Программно извлекать содержимое InstallShield setup.exe

    Шпионаж на JQuery Селекторы в Жасмин

    Должен ли я отключить USB-накопитель, прежде чем отключать его?

    MySQL – выбор последней вставленной строки проще всего

    Bitlocker не будет инициализироваться на 4-Тбайт-диске с 4K секторами

    Давайте будем гением компьютера.