通过 URL 通过代理向内存数据提供图像数据

Posted

技术标签:

【中文标题】通过 URL 通过代理向内存数据提供图像数据【英文标题】:Serve Image Data Via URL Through Proxy To In Memory Data 【发布时间】:2017-08-01 12:48:58 【问题描述】:

目标:在 IE11 和 Edge 中根据原始数据渲染图像。

问题:

图像来自对仅返回原始图像数据的 API 的调用。 图像数据服务是内部的,不能也不应该直接从外部网络(互联网)访问。 可以使用发送到图像标签<img src="data://image/jpeg;base64,#base64encodedDataHere"> 的图像的base64 编码在其他浏览器中呈现数据,但它不会在IE 中呈现,因为数据将始终超过此类标签的32kb 限制。

问题: 在我的 Rails 应用程序中,是否可以设置某种代理,以便我可以构建一个指向我的 Rails 应用程序服务器的 URL 并在图像标签中使用它,例如<img src='http://my-rails-app-server.com/images/123'>,然后点击服务进行检索图像数据,然后以某种方式将其返回给浏览器,这与图像源所期望的一样。

一些伪代码:

class ImageProxy < ApplicationController
  def show
    data = ExternalImageDataRetriever.get_data_from("internal-network-image-service/images/123")
    render something: data
  end
end

【问题讨论】:

【参考方案1】:

事实证明这非常容易。

我已经构建了向我的网络内部的外部 API 发出图像请求的工具。调用 API 会返回 2 个重要的东西:原始图像数据和 mime 类型。

我所要做的就是将它们穿过铁轨。

控制器动作最终看起来像这样

class ImageProxy < ApplicationController
  def show
    service_response = ExternalImageDataRetriever.get_data_from("internal-network-image-service/images/123")
    render text: service_response.data, layout: nil, content_type: service_response.mime_type
  end
end

之后它只是在视图中的图像标签中使用到该控制器操作的路由。

<%= image_tag image_proxy_path(id: 123) %>

【讨论】:

以上是关于通过 URL 通过代理向内存数据提供图像数据的主要内容,如果未能解决你的问题,请参考以下文章

点击事件后:如何通过 javascript 向 URL 添加内容?

通过注册的URL Scheme向目标APP传递参数

如何通过 API URL 显示图像?迅速

redis 数据类型

PHP通过curl向其它服务器发请求并返回数据

存储可以通过调用 url 呈现的二进制数据的理想位置