Принудительная загрузка файла на веб-сервере - ASP.NET С#
Мне нужно принудительно инициировать загрузку файла .sql, когда пользователь нажимает кнопку в моем веб-приложении на основе ASP.NET(С#).
Как и при нажатии кнопки, диалог открытия должен открываться на конце клиента...
Как это сделать?
ИЗМЕНИТЬ
Это код, который я использую
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
Что не так?
Ответы
Ответ 1
Создайте отдельный обработчик HTTP (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 на DownloadSqlFile.ashx
.
Ответ 2
Вам нужно сообщить браузеру, что то, что вы отправляете, не является 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
Ответ 3
Проблема заключается в том, что вы используете код на той же странице, который в настоящее время загружен в браузере. Вы пытаетесь изменить поток ответов и расположение текущей загруженной страницы. Вместо этого создайте отдельный HttpHandler, как это было предложено Мехрдадом. Затем, нажав кнопку, вы вызовете URL-адрес обработчику. Кнопка может быть простой гиперссылкой, в которой исходный URL имеет следующий адрес:
<a href="DownloadSqlFile.ashx">Download SQL</a>
Имеют смысл? Точка, , вы не можете изменить ответ уже загруженной страницы. Запустите новый запрос, используя обработчик для выполнения работы.
Ответ 4
Добавьте Response.Clear
перед тем, как Response.Write
исправить ошибку, если она правильно указана в диалоговом окне Chrome.
Итак, чтобы интегрировать в фрагмент в другом ответе...
//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;
Ответ 5
Решение ниже работает для меня
string fileNameAndExtension = "thisFile.pdf";
string fullPath = "../folder/files/" + fileNameAndExtension;
Response.Clear();
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension );
Response.TransmitFile(fullPath);
Response.End();