Передать сгенерированный файл XML без сохранения на диск

У меня есть большое приложение веб-формы, которое я хочу разрешить пользователю экспортировать свои данные, если они не хотят заполнять всю форму сразу. Затем, когда они вернутся, они смогут импортировать данные и продолжить с того места, на котором они остановились.

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

Я дошел до того, что создаю XML-файл, содержащий все данные формы, но я хочу, чтобы клиент мог загрузить этот XML-файл без необходимости сохранения приложением его на сервере, даже временно.

Можно ли создать файл XML и передать его через поток/вложение клиенту, не сохраняя его на диск?

Я использую С# Asp.net


person TruthStands    schedule 10.12.2009    source источник


Ответы (5)


Вы можете написать в HttpResponse:

        HttpResponse response = HttpContext.Current.Response;

        string xmlString = "<xml>blah</xml>";
        string fileName = "ExportedForm.xml";

        response.StatusCode = 200;

        response.AddHeader("content-disposition", "attachment; filename=" + fileName);
        response.AddHeader("Content-Transfer-Encoding", "binary");
        response.AddHeader("Content-Length", _Buffer.Length.ToString());

        response.ContentType = "application-download";
        response.Write(xmlString);
person Cory Charlton    schedule 10.12.2009
comment
Обратите внимание, что я специально использую ContentType приложения-загрузки, а не более точный тип пантомимы application/xml или text/xml. Это сделано для устранения проблемы в IE6, из-за которой имя файла в заголовке содержимого-диспозиции не используется для имени файла по умолчанию «Сохранить как». - person Cory Charlton; 10.12.2009

Вы не указываете, какую серверную технологию вы используете, но в целом:

  1. Создайте свой XML-документ в памяти и запишите его в свой поток ответов.
  2. Измените заголовок Content-Type на text/xml
  3. Измените заголовок Content-disposition на attachment; filename=data.xml;

Некоторые ссылки: http://en.wikipedia.org/wiki/MIME#Content-Disposition

person mlsteeves    schedule 10.12.2009

Загляните в MemoryStream.

http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx

Вы должны иметь возможность хранить XML в памяти, а затем передавать его своему клиенту через HTTP-запрос или как вам угодно.

person Ian Jacobs    schedule 10.12.2009

    HttpResponse response = HttpContext.Current.Response;

    string xmlString = "<xml>blah</xml>";
    string fileName = "ExportedForm.xml";

    response.StatusCode = 200;

    response.AddHeader("content-disposition", "attachment;

имя_файла=" + имя_файла);

    response.ContentType = "application-download";
    response.Write(xmlString);

Но он сохраняет все содержимое страницы в файл

person Alexander    schedule 30.09.2011
comment
Я решил это. Но теперь у меня проблемы с национальными символами. Как установить кодировку в Response? - person Alexander; 30.09.2011
comment
Тоже решил. Response.ContentEncoding = System.Text.Encoding.GetEncoding(windows-1257); - person Alexander; 30.09.2011

да. В PHP это выглядит так:

header("Content-type: text/xml");
$headerText = "Content-disposition: attachment; filename=file.xml";
header($headerText); 
echo $your_XML_contents;
exit;
person tloach    schedule 10.12.2009
comment
К сожалению, я забыл упомянуть, что использую C# Asp.net - person TruthStands; 10.12.2009
comment
Тогда обратите больше внимания на комментарий mlsteeves, то же самое, но он не зависит от языка: D - person tloach; 10.12.2009