Каков наилучший способ создания текстового файла на веб-сайте .net? - PullRequest
3 голосов
/ 25 сентября 2008

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

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

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

Ответы [ 4 ]

4 голосов
/ 25 сентября 2008

Не создавайте его вообще, используйте 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
   }                      
}
4 голосов
/ 25 сентября 2008

Используйте 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());

}
3 голосов
/ 25 сентября 2008

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

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

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

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

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

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

0 голосов
/ 25 сентября 2008

Имейте в виду, что на стороне сервера не должно быть «файла». Это клиент, который превращает его в файл.

...