【问题标题】:How can I call an aspx page and have it return an image?如何调用 aspx 页面并让它返回图像?
【发布时间】:2011-04-21 21:10:01
【问题描述】:

******基于 cmets 将帖子编辑为更新的代码示例*******

所以,明确地说,我有两个文件。第一个文件称为 FinalImage.aspx,下面是该页面的代码:

<html>
  <body>
    <img src="newpage.aspx" />
  </body>
</html>

newpage.aspx 有以下代码,基于 Jason 在下面 cmets 中的示例:

<%@ Page Language="C#" %>

<script runat="server" language="c#">

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "image/png";
        byte[] data = System.IO.File.ReadAllBytes("http://mystatus.skype.com/smallclassic/eric-greenberg");

        Response.OutputStream.Write(data, 0, data.Length);
        Response.OutputStream.Flush(); 
        Response.End();
    }

</script>

如果我调用 FinalImage.aspx,我会看到损坏的图像。

如果我直接调用 newpage.aspx,我会收到“不支持 URI 格式错误”

不过,我认为它已经接近了。

此外,对于刚刚阅读此内容的任何人,都需要此解决方案来解决以下事实:Skype 的 Skype 按钮没有 https 选项来告知 Skype 用户的状态。创建此代理页面将使其正常工作,而不会在浏览器中引起“混合”安全警报。

【问题讨论】:

  • 我不认为File.ReadAllBytes 支持URI 格式,它只适用于本地文件。您需要创建一个 WebRequest 并下载字节。

标签: c# asp.net image


【解决方案1】:

只是为了扩展 Aliostad 的答案,这里有一个可能对您有所帮助的 sn-p:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "image/jpeg";

    var data = // .... get the content of the images as bytes. e.g. File.ReadAllBytes("path to image");

    Response.OutputStream.Write(data, 0, data.Length);
    Response.OutputStream.Flush(); // Not sure if needed, but doesn't hurt to have it.
    Response.End();
}

不确定上述是否 100% 正确,但我最近在一个项目中确实使用了类似的东西来从 aspx 页面返回图像。不幸的是,我现在没有那个代码。

【讨论】:

  • OK - 到目前为止,我有一个名为“FinalImage.aspx”的文件,其中只有 Html 标记和一个图像标记,其 src 设置为 newpage.aspx。
  • 废话 - 没有完成评论:newpage.aspx 中有很多你的例子:
  • 你知道吗 - 我要去编辑原始帖子,看看是否可行。请待命。
【解决方案2】:

所以,这是最终的工作代码:感谢大家帮助我们一点一点地追踪这个(可以这么说......)

<%@ Page Language="C#" %>

<script runat="server" language="c#">
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "image/png";

        System.Net.WebClient wc =  new System.Net.WebClient();

        byte[] data = wc.DownloadData("http://mystatus.skype.com/smallclassic/eric-greenberg");
        Response.OutputStream.Write(data, 0, data.Length);
        Response.OutputStream.Flush(); 
        Response.End();
    }
</script>

【讨论】:

    【解决方案3】:

    您可以在实现 IHttpHandler 的类的 ProcessRequest 方法中使用上面发布的代码。这比使用页面更轻量级,因为您将避免页面生命周期。

    http://wiki.asp.net/page.aspx/687/http-handlers-to-handle-images/ 有一个示例。它比您需要的要复杂一些,但您应该能够根据自己的需要对其进行修改。

    【讨论】:

      【解决方案4】:

      为了进一步扩展(根据 Jason 的回答),您不希望将响应流读入 StreamReader(因为结果不是文本)。您可以在需要它的页面上使用 aspx 页面作为图像的 src。例如:

      <html>
          <image src="~/MyDynamicImage.aspx"/>
      </html>
      

      因为 MyDynamicImage.aspx 返回一个图像作为它的响应,它可以被视为一个图像(就好像你指向一个静态的.jpg,例如)。

      【讨论】:

        【解决方案5】:

        您需要将内容类型设置为“image/jpg”或相关图像MIME。

                    Response.ContentType = "Image/jpg";
        

        【讨论】:

        • 查看更新。在页面加载中。您不需要任何视觉效果和控件。只是代码。
        猜你喜欢
        • 2012-03-30
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 2015-08-08
        • 2016-09-20
        • 2013-01-15
        • 2011-08-18
        • 1970-01-01
        相关资源
        最近更新 更多