Pergunta

Eu tenho uma página no meu aplicativo web vb.net que as necessidades de jogar um monte de dados em um arquivo de texto e, em seguida, apresentá-lo ao usuário para download. Qual é a melhor maneira / mais eficiente para construir tal arquivo de texto em um servidor web .net?

Edit:. Responder a uma pergunta abaixo, este vai ser um download uma vez e depois jogar fora tipo de arquivo

Update: Eu coladas as sugestões por John Rudy e DavidK, e ele funcionou perfeitamente. Obrigado, todos!

Foi útil?

Solução

A resposta vai depender se, como Forgotten Semicolon menciona, você precisa de downloads repetidas ou descartáveis ??uma vez-e-feito.

De qualquer maneira, a chave será para definir o tipo de conteúdo da saída para assegurar que uma janela de download é exibida. O problema com a saída de texto em linha reta é que o navegador tentará exibir os dados em sua própria janela.

O núcleo maneira de definir o tipo de conteúdo seria algo semelhante ao seguinte, assumindo que o texto é a string de saída e nome do arquivo é o nome padrão que você deseja que o arquivo a ser salvo (localmente) como.

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

Isto irá pedir uma transferência para o usuário.

Agora fica mais complicado se você precisa para literalmente salvar o arquivo no seu servidor web - mas não tão terrivelmente. Não que você gostaria de escrever o texto para o seu arquivo de texto usando as classes no System.IO. Verifique se o caminho que você escreve para ser gravado pelo Serviço de Rede, IUSR_MachineName e usuários ASPNET Windows. Caso contrário, mesmo negócio -. Uso tipo de conteúdo e cabeçalhos para garantir o download

Eu recomendo não literalmente salvar o arquivo a menos que você precisa - e, mesmo assim, a técnica de fazê-lo diretamente no servidor pode não ser a idéia certa. (Por exemplo, o que se precisar de controle de acesso para download disse arquivo? Agora você tem que fazer isso fora de sua raiz aplicativo, que pode ou não pode mesmo ser possível dependendo do seu ambiente de hospedagem.)

Assim, sem saber se você está em um one-off ou arquivo-must-realmente-modo de economia, e sem saber implicações de segurança (que você provavelmente terá que trabalhar por si mesmo se você realmente precisa do lado do servidor salva) , que é sobre o melhor que posso dar-lhe.

Outras dicas

Use um StringBuilder para criar o texto do arquivo e, em seguida, enviá-lo para o usuário usando Content-Disposition.

Exemplo encontrada aqui: http://www.eggheadcafe.com/community/ aspnet / 17/76432 / uso-a-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());

}

Do not construí-lo em tudo, usar um HttpHandler e servir o arquivo de texto direto para o fluxo de saída:

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

O bloco de código até o meio é um exemplo bom, você pode ajustar a sua própria:

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
   }                      
}

Tenha em mente que não precisar ser um 'arquivo' no final do servidor. É o cliente que o transforma em um arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top