【问题标题】:using WebClient class to return image data and render the image in a tag使用 WebClient 类返回图像数据并在标签中渲染图像
【发布时间】:2013-10-11 10:02:03
【问题描述】:

我有一个使用 ASP 中的 WebClient 类的 GenericHandler 页面。

如果我想将图像加载到图像标签中,我不知道该怎么做。我试过了:

<img src="handler.asxh?url=http://somesite.com&contentType=image" />

但这并没有返回成功的图像,因为处理程序没有返回对象的路径,而是为它下载数据。

话虽如此:我有一堆数据,代表所述图像只是我无法将其放入标签中。

我使用身份验证进入网络服务器以获取存储在其中的图像,它完全符合我的要求,但图像本身被压缩并隐藏在一个不面向外部的数据库中,所以这样做不会似乎有效。

应该怎么做?

编辑:处理程序实现

public void ProcessRequest(HttpContext context){
  WebClient wsb = new WebClient();
  string url = context.Request.QueryString["url"];
  string content = context.Request.QueryString["contentType"];
  string response = wsb.DownloadString(url);
  context.Response.ContentType = content;
  context.Response.Write(response);
}

编辑 2: 这用于执行涉及不支持它的旧浏览器的 CORS。使用通用处理程序,在这种情况下,向客户端写出一个字节数组,您可以通过 URL 传入散列的身份验证令牌,然后解析并放入 WebClient 类标头中。

【问题讨论】:

  • 显示处理程序的实现。
  • @EugeneS。刚刚添加了一个快速而肮脏的实现。我用它从需要身份验证的服务器获取 json 数据等......所以可以有其他与标​​头数据相关的参数。然而,这个较短的版本是为获得的图像执行处理所需要的全部内容。

标签: javascript html asp.net image


【解决方案1】:

您似乎将图像作为字符串下载。但是,图像是二进制数据,不容易存储在字符串中(不包括 base64 或其他转换)。
您应该将图像下载为字节数组。

然后您可以使用response.BinaryWrite(byteArray)-方法将数据发送到客户端。
以下代码未经测试,但应为您指明正确的方向:

public void ProcessRequest(HttpContext context){
  WebClient wsb = new WebClient();
  string url = context.Request.QueryString["url"];
  string content = context.Request.QueryString["contentType"];
  byte[] response = wsb.DownloadData(url);
  context.Response.ContentType = content;
  context.Response.BinaryWrite(response);
}

【讨论】:

  • 啊,好的。所以,也许我最好不要将内容类型设置为图像,而是检查内容类型是否为图像,如果是,则写出二进制文件?这样,我仍然可以将它用于返回字符串的东西,例如但不限于返回 JSON、字符串、xml 等。
  • @Fallenreaper 这确实是一个选择。这样,您还拥有一个有限的允许内容类型列表,而不是允许客户端向您抛出的所有内容。在我看来,最好使用固定的内容类型(图像),并为其他数据制作单独的处理程序......
  • 很高兴知道。谢谢你。我会试试这个,看看会发生什么。我会尽快给您更新以供确认。
  • 已确认。您只需写出 byte[] 并将其直接放入 src 标签即可呈现图像。执行此中间步骤允许在旧版浏览器中使用 CORS。
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 2018-02-21
  • 2012-02-15
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多