2011-04-29 50 views
2

我是新来的ASP.net编程和网络编程一般,所以我不知道所有的条款,但我会尽我所能得到的点跨越。传送大量数据到一个aspx网站,并取回一个图像

我正在写一个图像发生器,它将接收一个字符串并输出一个PNG。我已经能够成功地做到这一点使用访问该网站会生成可用于合适的网页进行进一步显示里面PNG文件的语法LabelGenerator.aspx?epl2=UrlEncodedMessageGoesHere。但是,问题是我可能有超过2048字节的消息,IIS不喜欢这样。

我知道这样一个POST而不是GET将释放我从2048极限,但是我不知道怎么打发沿,如果我想使用一个IMG标签内所得到的图像信息。

这里是我当前如何做一些代码。

public partial class LabelGenerator : System.Web.UI.Page 
{ 
    RotateFlipType RotateFlip; 
    float Scale; 
    String LabelCommands; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      int rotateFlipInt; 
      if (!float.TryParse(this.Request.QueryString["Scale"], out Scale)) 
       Scale = 1; 
      if (!int.TryParse(this.Request.QueryString["RotateFlip"], out rotateFlipInt)) 
       rotateFlipInt = (int)RotateFlipType.Rotate270FlipNone; 
      RotateFlip = (RotateFlipType)rotateFlipInt; 
      LabelCommands = this.Request.QueryString["epl2"]; 

      if (LabelCommands != null && LabelCommands.Length > 0) 
      { 
       using (var bitmap = GenerateLabel()) 
       { 
        Response.ClearContent(); 
        Response.ClearHeaders(); 
        Response.ContentType = "image/png"; 
        bitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Png); 
       } 

      } 
      else 
      { 
       Response.Write("You did not enter a valid epl2 command"); 
      } 
     } 
     catch (Exception ex) 
     { 
      Response.Write("An error occurred during processing."); 
     } 

    } 
    private Bitmap GenerateLabel() 
    { 
     //(snip) 
    } 
} 

回答

2

看一看谷歌用于其Chart API的解决方案来解决同样的问题

指定图表在浏览器的URL或标签被称为GET请求。提出GET请求很简单,但GET URL限制为2K个字符。如果你有更多的数据呢? 幸运的是,图表API支持图表请求高达16K长HTTP POST。权衡是使用POST增加的复杂性。

基本上他们在页面上创建一个包含要发送数据的隐藏字段的表单。发布此表单时,从IFRAME内的回复是一张图片。 Thier形式看起来是这样的

<form action='https://chart.googleapis.com/chart' method='POST'> 
    <input type="hidden" name="cht" value="lc" /> 
    <input type="hidden" name="chtt" value="This is | my chart" /> 
    <input type='hidden' name='chs' value='600x200' /> 
    <input type="hidden" name="chxt" value="x,y" /> 
    <input type='hidden' name='chd' value='t:40,20,50,20,100'/> 
    <input type="submit" /> 
</form> 

在这个例子中,用户需要点击提交按钮来获得图像。在Google page有使用JavaScript来触发POST

var frm = document.getElementById('post_form'); 
if (frm) { frm.submit(); } 
+0

iframe解决方案非常适合我需要做的事情。 – 2011-05-01 16:56:19

0

如果你想在一个img标签使用它,我相信你必须首先将其保存到磁盘/服务器。然后使用img标签的src属性通过Web引用来引用它。

<img src="images/image.png">如果你有一个目录关闭当前目录中名为图像将正常工作。

或者

如果要指定图像的精确路线

<img src="http://yourdomain.com/images/image.png">

+0

@Scott张伯伦其实就是做在那边好工作。将位图直接保存到流中避免了首先将其保存到磁盘 – 2011-04-29 22:47:43

+0

@Ron Harlev,那么他想传递给img标签的信息是什么? – 2011-04-29 22:50:54

+0

我能做些什么来解决图像请求的2k限制。 – 2011-05-01 16:53:20

1

的进一步的例子下面是一个快速的样品,我设计了一个使用JQuery使异步交检索base64编码图像。不确定浏览器的兼容性。

<div id="result"></div> 
<script language="javascript" type="text/javascript"> 
    $(document).ready(function() { 
     $.post('Image.aspx', { Mood: "Happy" }, function (data) { 
      $('#result').html(data); 
     }); 
    }); 
</script> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    byte[] image; 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    switch (Request.Form["Mood"]) 
    { 
     case "Happy": 
      image = System.IO.File.ReadAllBytes(Server.MapPath("ImageHappy.png")); 
      Response.Write("<img src=\"data:image/png;base64," + Convert.ToBase64String(image) + "\" />"); 
      break; 
     case "Sad": 
      image = System.IO.File.ReadAllBytes(Server.MapPath("ImageSad.png")); 
      Response.Write("<img src=\"data:image/png;base64," + Convert.ToBase64String(image) + "\" />"); 
      break; 
    } 
    Response.Flush(); 
    Response.Close(); 
} 
相关问题