Ciao a tutti

            Scrivo di un argomento di cui oramai si sa gia tutto ma serve soprattutto a me come promemoria; in particolare questa funzione serve per visualizzare un file CSV in pagina Web senza redirigere (Response.Redirect) la chiamata a un file CSV su FileSystem, ma leggendolo o scrivendolo direttamente in memoria per poi scriverlo sullo stream output della pagina ASPX (Page.Response).

           

            In particolare quando si adotta questa tecnica è fondamentale specificare il “MIME type”; per i file CSV è “text/csv”, aggiungendo l’Header (AddHeader) possiamo specificare se Explorer caricherà il documento come “attachment” (aprendolo in una nuova window) o “inline”, in questo caso Explorer lo aprirà nella pagina ASPX corrente associato al flusso Response.

 

MemoryStream ms = new MemoryStream();

TextWriter tw = new StreamWriter(ms);

 

foreach (DataRowView drv in dvRisulatiGrid) {

   DataRow dr = drv.Row;

 

   string A = (string)dr[“A”];

   string B = (string)dr[“B”];

   string C = (string)dr[“C”];

 

   tw.Write(A);

   tw.Write(";");

   tw.Write(B);

   tw.Write(";");

   tw.WriteLine(C);

   tw.Flush();

}

 

FlushOutput(ms, false);

 

            Naturalmente nel MemoryStream ci sarà il contentudo del file CSV che verrà interpretato da Excel (o da qualsiasi altro programma associato). Il CSV avrà il classico formato A;B;C;<CRLF>

 

private void FlushOutput(MemoryStream ms, bool bAttachment) {

    try{

        Response.Clear();

        Response.ClearContent();

        Response.ClearHeaders();

 

        BinaryWriter bwriter = new BinaryWriter(Response.OutputStream);

 

        Response.ContentType = "text/csv";

        Response.BufferOutput = true;

        if (bAttachment) {

            Response.AddHeader("Content-Disposition", "attachment; filename=\"ExportResult.csv\"");

        } else {

            Response.AddHeader("Content-Disposition", "inline; filename=\"ExportResult.csv\"");

        }

 

        bwriter.Write(ms.ToArray());

        bwriter.Close();

    } catch (Exception ex) {

        string Error = ex.ToString();

    } finally {

        Response.End();

    }

}

 

            Questo meccanismo ci consente di sostituire il normale flusso HTML con un qualsiasi flusso binario come PDF, DOC, RTF specificando per ogni documento il suo MIME corretto.

 

http://www.iana.org/assignments/media-types/

http://www.asahi-net.or.jp/en/guide/cgi/mimetype.html

http://www.ltsw.se/knbase/internet/mime.htp

 

            Grazie al MIME type Explorer sa a che applicativo associare lo stream binario per visualizzare correttamente il file dentro la nostra pagina di Explorer J.

 

Ciao a tutti.

Allino