内存字符串直接到文件显示在html中

时间:2014-03-13 10:40:55

标签: c# asp.net memorystream m

是否可以向html发送内存流,如文件?

这个想法不是在硬盘中创建文件。

我已经创建了流,我可以下载文件没问题,问题是传递给变量发送到aspx页面,所以我可以用它来显示特定div上的文件。

有可能吗?无需在磁盘中创建文件。

最诚挚的问候和谢谢

这是我的代码:

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


    }

和错误:

无法访问已关闭的流。

thansk

2 个答案:

答案 0 :(得分:0)

如果您知道内存流将返回的内容类型,您可以将流读取到处理该类型的变量,然后进行处理。

有关String的示例,请参阅How do you get a string from a MemoryStream?。他们将一个字符串写入内存流,然后再将其读回。

答案 1 :(得分:0)

可能,您必须将内存流转换为字节数组。然后,您必须将您的字节数组转换为Base64字符串。最后你必须将base64字符串放入你的img src

关于以html形式显示base64的解释。

请注意,这适用于图像。任何其他文件都不会起作用,因为这些文件需要下载,因此需要有物理位置。除非你打算为你要显示的文件类型编写一个javascript处理程序。

<强>更新 对于pdf,您可以执行以下操作,但它可能不兼容crossbrowser。

  

代码隐藏

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

更新了您的代码:

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;


}