Принудительная загрузка файла на веб-сервер - ASP .NET C # - PullRequest
18 голосов
/ 17 мая 2009

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

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

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

EDIT

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

        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();

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

альтернативный текст http://img40.imageshack.us/img40/2103/erroro.gif

Что не так?

Ответы [ 5 ]

29 голосов
/ 17 мая 2009

Создайте отдельный обработчик 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.

18 голосов
/ 17 мая 2009

Вы должны сообщить браузеру, что отправляемое вами не является 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

5 голосов
/ 17 мая 2009

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

<a href="DownloadSqlFile.ashx">Download SQL</a>

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

1 голос
/ 17 мая 2009

Добавьте 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;
0 голосов
/ 19 сентября 2017

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

string fileNameAndExtension = "thisFile.pdf";     
string fullPath = "../folder/files/" + fileNameAndExtension;       
Response.Clear();
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension );
Response.TransmitFile(fullPath);
Response.End();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...