0

Is it possible to send to an html a memorystream, like a file?

The idea is not creating a file in the hard drive.

I have created the stream and I can donwload the file no problem, the problem is passing to the variable to send to the aspx page so I can use it to show the file on a particulary div.

Is it possible? without creating a file in the disk.

Best Regards and Thanks

this is the Code i have:

        public string ExportMemoryPdf(DataTable dtpdf, String Path)
    {
        string User = System.Web.HttpContext.Current.User.Identity.Name.ToString();
        string Date = DateTime.Now.ToString();
        string Year = DateTime.Now.ToString("yyyy");
        string Month = DateTime.Now.ToString("MM");
        string Day = DateTime.Now.ToString("dd");
        string Hour = DateTime.Now.ToString("hh");
        string Minutes = DateTime.Now.ToString("mm");
        string Seconds = DateTime.Now.ToString("ss");
        string FileName = User + Day + Month + Year + Hour + Minutes + Seconds;


        //Session["WhereIsIt"].ToString()
        //-----------------------Chamada de Classe de Registo de Eventos--------------------------
        //string Message = "The User Asked For a PDF File From the Table" + Request.QueryString["Position"] + "With the Filename: " + FileName;
        string Message = "The User Asked For a PDF File From the Table With the Filename: " + FileName;
        //OneGrid.ExportSettings.IgnorePaging = true;
        //OneGrid.Rebind();
        //RegisterFile.AddRegistry(User, Message, "Message");

        //------------------------------ Variaveis para aceder a Tabela --------------------------

        int columncount = dtpdf.Columns.Count;
        int rowcount = dtpdf.Rows.Count;

        //-------------------------------Iniciaçao de criação do documento -----------------------
        Document pdf1 = new Document(PageSize.A4_LANDSCAPE.Rotate());


        using (MemoryStream output = new MemoryStream())
        {

            pdf1.SetMargins(0, 0, 80, 50);
            iTextSharp.text.Font font20 = iTextSharp.text.FontFactory.GetFont(iTextSharp.text.FontFactory.HELVETICA, 10);

            //----------------------------------Preparação da Tabela ---------------------------------
            PdfPTable table = new PdfPTable(columncount);

            //-----------------------------------Criação de Ficheiro ---------------------------------

            string path = System.Web.HttpContext.Current.Server.MapPath(Path);
            //string path = System.IO.Path.GetTempPath();
            //Label1.Text = path.ToString();
            //PdfWriter pdfWriter = PdfWriter.GetInstance(pdf1, new FileStream(path + "/" + FileName + ".pdf", FileMode.Create));

            PdfWriter pdfWriter = PdfWriter.GetInstance(pdf1, output);

            //----------------------------------- Dimensões da Tabela ---------------------------------------
            table.WidthPercentage = 90;

            //-------------------------------Criação do Header e Footer de cada folha-------------------------
            KIOSK.Classes.Header_Footer page = new Classes.Header_Footer();


            //-----------------------------------Inserção de conteudos -------------------------------
            pdfWriter.PageEvent = page;
            pdf1.Open();

            //table.AddCell(HttpContext.Current.Request.QueryString["position"].ToString());

            for (int z = 0; z < columncount; z++)
            {
                var sabersenao = dtpdf.Columns[z].ToString();
                table.AddCell(new Phrase(sabersenao, font20));
            }

            for (int u = 0; u < rowcount; u++)
            {
                int contador = 0;
                while (contador < columncount)
                {
                    var CamposCorrigidos = dtpdf.Rows[u].ItemArray[contador].ToString();

                    StringBuilder ConvPassword = new StringBuilder(CamposCorrigidos);
                    ConvPassword.Replace("&amp;", string.Empty);
                    ConvPassword.Replace("&nbsp;", string.Empty);

                    string CamposCorrigidos2 = ConvPassword.ToString();

                    table.AddCell(new Phrase(CamposCorrigidos2, font20));
                    contador += 1;
                }
            }

            //----------------------Abertura/Fecho e inserção do componentes necessrios ao pdf---------

            pdf1.Add(table);
            pdf1.Close();

            //System.Web.HttpContext.Current.Response.ClearContent();
            //System.Web.HttpContext.Current.Response.ClearHeaders();
            //System.Web.HttpContext.Current.Response.ContentType = "application/pdf";
            //System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);

            //System.Web.HttpContext.Current.Response.BinaryWrite(output.ToArray());
            //System.Web.HttpContext.Current.Response.End();
            //System.Web.HttpContext.Current.Response.Flush();
            //System.Web.HttpContext.Current.Response.Clear();

            //System.Web.HttpContext.Current.Response.ContentType = "application/pdf";
            //System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "PdfViewer; filename=" + FileName +".PDF");
            ////System.Web.HttpContext.Current.Response.AddHeader("content-length", output.Length.ToString());
            //System.Web.HttpContext.Current.Response.BinaryWrite(output.ToArray());

            //System.Web.HttpContext.Current.Response.End();


            //output.Read(pdfByte, 0, (int)pdfByte.Length);



            output.Read(pdfByte, 0, (int)pdfByte.Length); 

            var strBase64 = Convert.ToBase64String(pdfByte);
        }
        return Convert.ToBase64String(pdfByte);


    }

and the error:

Cannot access a closed Stream.

thansk

2 Answers2

0

If you know the content type the memorystream will return, you can read the stream to a variable which handles that type and then process that.

for an example with a String, see How do you get a string from a MemoryStream?. they write a string to a memorystream and then read it back out again.

Community
  • 1
  • 1
Nzall
  • 3,439
  • 5
  • 29
  • 59
0

It's possible, you will have to convert your memorystream to an array of bytes. Then you will have to convert your array of bytes to a Base64 string. And finally you will have to put that base64 string into your img src

An explanation about base64 to image in html.

Take notice that this will work for images. Any other files won't work as since those files need to be downloaded and thus need to have a physical location. Unless you plan on writing a javascript handler for the filetypes you which to show.

Update: For pdf's you can do the following, however it might not be crossbrowser compatible.

CodeBehind

//string filepath = Server.MapPath("/Temp.pdf");
byte[] pdfByte; //= Helper.GetBytesFromFile(filepath);
using(var stream = ....) {
stream.read(pdfByte,0,(int)pdfByte.length);
var strBase64=Convert.ToBase64String(pdfByte);

HTML

<object data=",<<yourBase64StringHereWithoutthesmallerthenbiggerthenquotes==>>" type="application/pdf" width="800px"></object>

Updated your code:

public string ExportMemoryPdf(DataTable dtpdf, String Path)
{
    string User = System.Web.HttpContext.Current.User.Identity.Name.ToString();
    string Date = DateTime.Now.ToString();
    string Year = DateTime.Now.ToString("yyyy");
    string Month = DateTime.Now.ToString("MM");
    string Day = DateTime.Now.ToString("dd");
    string Hour = DateTime.Now.ToString("hh");
    string Minutes = DateTime.Now.ToString("mm");
    string Seconds = DateTime.Now.ToString("ss");
    string FileName = User + Day + Month + Year + Hour + Minutes + Seconds;
    Request.QueryString["Position"] + "With the Filename: " + FileName;
    string Message = "The User Asked For a PDF File From the Table With the Filename: " + FileName;

    int columncount = dtpdf.Columns.Count;
    int rowcount = dtpdf.Rows.Count;

    Document pdf1 = new Document(PageSize.A4_LANDSCAPE.Rotate());
        pdf1.SetMargins(0, 0, 80, 50);
        iTextSharp.text.Font font20 = iTextSharp.text.FontFactory.GetFont(iTextSharp.text.FontFactory.HELVETICA, 10);
        PdfPTable table = new PdfPTable(columncount);
        string path = System.Web.HttpContext.Current.Server.MapPath(Path);
        table.WidthPercentage = 90;
        KIOSK.Classes.Header_Footer page = new Classes.Header_Footer();
        for (int z = 0; z < columncount; z++)
        {
            var sabersenao = dtpdf.Columns[z].ToString();
            table.AddCell(new Phrase(sabersenao, font20));
        }
        for (int u = 0; u < rowcount; u++)
        {
            int contador = 0;
            while (contador < columncount)
            {
                var CamposCorrigidos = dtpdf.Rows[u].ItemArray[contador].ToString();

                StringBuilder ConvPassword = new StringBuilder(CamposCorrigidos);
                ConvPassword.Replace("&amp;", string.Empty);
                ConvPassword.Replace("&nbsp;", string.Empty);

                string CamposCorrigidos2 = ConvPassword.ToString();

                table.AddCell(new Phrase(CamposCorrigidos2, font20));
                contador += 1;
            }
        }
    var base64String = string.Empty;
    using (MemoryStream output = new MemoryStream())
    {
        PdfWriter pdfWriter = PdfWriter.GetInstance(pdf1, output);
        pdfWriter.PageEvent = page;
        pdf1.Open();
        pdf1.Add(table);
        pdf1.Close();

        bytes = output.ToArray();

        var base64String = Convert.ToBase64String(bytes);
    }
    return base64String;


}
woutervs
  • 1,500
  • 12
  • 28