Как открыть файл MemoryStream в браузере? - PullRequest
4 голосов
/ 24 августа 2011

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

MemoryStream memoryStream = new MemoryStream();
TextWriter textWriter     = new StreamWriter(memoryStream);
textWriter.WriteLine("Something");
memoryStream.Close();

Вроде бы работает, но мое требование - открыть этот файл в браузере клиента, когда он / она нажимает кнопку. Поскольку этот файл не имеет физического пути, как .... / text.txt. Я не знаю, как открыть его в браузере.

Как я могу сделать это в ASP.Net с помощью C #. Я много искал, но не смог найти решение, работающее на меня.

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 24 августа 2011

Это намного проще, чем вы думаете. Имейте в виду, что протокол HTTP на самом деле не передает «файлы» в самом строгом смысле этого слова. Он передает запросы и ответы, каждый из которых содержит заголовки и контент. В этом случае вас интересуют заголовки и содержание ответа.

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

context.Response.ContentType = "image/png";
context.Response.WriteFile("~/Flower1.png");

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

context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");

Это отправит в браузер простой текст, не более того. Браузер не будет думать, что это веб-страница или что-то в этом роде, не будет применять к ней какие-либо стили и т. Д. Что касается веб-браузера, он просто загрузил текстовый файл со словами «Hello World». , Вы можете Response.Write() весь текст, который вы хотите построить этот файл.

Вы можете дополнительно настроить заголовки ответа , чтобы предоставить браузеру еще больше информации. Например, если вы добавите следующий заголовок в HttpResponse :

Content-Disposition: attachment; filename=myfile.txt

Затем браузер переведет это так, что этот «файл» должен быть загружен и сохранен, а не только отображен. (Конечно, настройки браузера пользователя могут указывать на его отображение в любом случае, но это правильный способ для сервера «предложить» браузеру, что он должен сохранить файл.)

С точки зрения браузера не имеет значения, откуда появился «файл». Было ли это из файловой системы сервера или динамически сгенерированным или волшебным заклинанием, это не имеет значения. Браузер занимается только заголовками ответов и контентом. Если заголовки говорят, что это текст, и они говорят, что это файл, то содержимое будет рассматриваться как текстовый файл.

3 голосов
/ 24 августа 2011

Зачем вам нужно писать MemoryStream? Просто запишите его в ответ HTTP, если вы хотите отправить его в браузер.

Response.WriteLine("Something");

Если вы хотите, чтобы браузер загружал этот ответ в виде файла, см. Здесь .

2 голосов
/ 24 августа 2011

Честно говоря, я считаю, что это не очень хорошая модель в веб-разработке.

Это просто чтение вашего файла и отправка его данных в виде текста на клиентскую часть (веб-браузер), отредактируйте его в текстовом поле.отправьте обратно измененный текст и сохраните его в виде файла с указанием пути или хранилища по вашему выбору.

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

1 голос
/ 24 августа 2011

Хорошо, думаю, я понял, что вы хотите.Вы говорите, что у вас есть кнопка, с которой вы хотите перейти к содержимому текстового файла, который вы хотите создать в памяти, но вы не знаете, на какой URL отправлять браузер, когда пользователь нажимает кнопку?

Если это так, то вы можете сделать следующее:

1) On the page that has the button, set the href (or link-location or whatever) of the button to be a new asp.net page (jet to be created). Something like "textfile.aspx" or whatever. Also, remove all the code regarding the memory-stream.
2) Create the new asp.net file (textfile.aspx, or whatever you decided to call it). The content of that file should be like this:

Response.WriteLine("Something"); // Or whatever you previously wrote to the MemoryStream

Дело в том, что вы должны разделиться на два разных файла (или отдельное действие на основе строки запроса).

...