Подтвердить что ты не робот

Принудительная загрузка файла на веб-сервере - 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

Что не так?

4b9b3361

Ответ 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();