是否可以向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("&", string.Empty);
ConvPassword.Replace(" ", 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
答案 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("&", string.Empty);
ConvPassword.Replace(" ", 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;
}