Каков наилучший способ сгенерировать текстовый файл на веб-сайте .net?

StackOverflow https://stackoverflow.com/questions/129927

Вопрос

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

Редактировать:чтобы ответить на вопрос, приведенный ниже, это будет файл, загружаемый один раз, а затем одноразовый.

Обновить:Я склеил предложения Джона Руди и Дэвидка, и это сработало идеально.Спасибо всем!

Это было полезно?

Решение

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

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

Основной способ установки типа содержимого был бы чем-то похожим на следующий, предполагая, что text - это выходная строка, а filename - имя по умолчанию, под которым вы хотите сохранить файл (локально).

HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/octet-stream";
response.Charset = "";
response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", filename));
response.Flush();
response.Write(text);
response.End();

Это вызовет запрос на загрузку для пользователя.

Теперь это становится сложнее, если вам нужно буквально сохранить файл на вашем веб-сервере - но не настолько ужасно.Там вы хотели бы записать текст в свой текстовый файл, используя классы в System.IO.Убедитесь, что путь, по которому вы записываете, доступен для записи сетевой службой, IUSR_MachineName и пользователями ASPNET Windows.В противном случае, та же сделка - используйте тип контента и заголовки для обеспечения загрузки.

Я бы рекомендовал не сохранять файл буквально, если только вам это не нужно - и даже в этом случае метод выполнения этого непосредственно на сервере может оказаться неправильной идеей.(НАПРИМЕР, что делать, если вам нужен контроль доступа для загрузки указанного файла?Теперь вам придется делать это вне корня вашего приложения, что может быть возможно, а может и вовсе невозможно, в зависимости от вашей среды размещения.)

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

Другие советы

Используйте StringBuilder для создания текста файла, а затем отправьте его пользователю, используя Content-Disposition .

Пример найден здесь:http://www.eggheadcafe.com/community/aspnet/17/76432/use-the-contentdispositi.aspx

private void Button1_Click(object sender, System.EventArgs e)
{
        StringBuilder output = new StringBuilder;
        //populate output with the string content
        String fileName = "textfile.txt";

        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        Response.WriteFile(output.ToString());

}

Не создавайте его вообще, используйте HttpHandler и отправляйте текстовый файл непосредственно в выходной поток:

http://digitalcolony.com/labels/HttpHandler.aspx

Блок кода на полпути вниз - хороший пример, вы можете настроить его по своему усмотрению:

public void ProcessRequest(HttpContext context)
{
   response = context.Response;
   response.ContentType = "text/xml";       
   using (TextWriter textWriter = new StreamWriter(response.OutputStream, System.Text.Encoding.UTF8))
   {
       XmlTextWriter writer = new XmlTextWriter(textWriter);
       writer.Formatting = Formatting.Indented;
       writer.WriteStartDocument();
       writer.WriteStartElement("urlset");
       writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
       writer.WriteAttributeString("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");
       writer.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");

       // Add Home Page
       writer.WriteStartElement("url");
       writer.WriteElementString("loc", "http://example.com");
       writer.WriteElementString("changefreq", "daily");
       writer.WriteEndElement(); // url

       // Add code Loop here for page nodes
       /*
       {
           writer.WriteStartElement("url");
           writer.WriteElementString("loc", url);
           writer.WriteElementString("changefreq", "monthly");
           writer.WriteEndElement(); // url
       }
       */
       writer.WriteEndElement(); // urlset
   }                      
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top