2011-04-29 39 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(); 
} 
相關問題