主要图像难题 - Node.js Express服务器

时间:2016-02-06 21:43:52

标签: javascript angularjs node.js image cloudinary

因此我们有一个Node.js的后端工具,用于搜索img标签的HTML网页。我们使用worker child_process执行此操作,以便不阻止主进程。我们在服务器上执行此操作的原因是因为我们在尝试使用AJAX / Angular $ http访问HTML页面时遇到了CORS问题。

当后端网络刮刀完成后,它可以向浏览器发送网址列表。浏览器可以对与这些URL相关的图像进行AJAX请求,但据我所知,前端会遇到与检索HTML时相同的CORS问题。

所以我们目前对这个问题有一个相当糟糕的解决方案。我们使用Cloudinary进行繁重的工作而不是我们的Node.js服务器处理base64。后端worker child_process擦除HTML,获取图像URL,然后向Cloudinary发送请求以检索图像并将我们的服务器发送回新的Cloudinary URL。然后我们将Cloudinary网址发送到前端,前端可以访问那些Cloudinary网址而不会出现任何CORS问题。

这有两个问题:

  
      
  1. 这个速度相当慢 - 抓取大约需要2秒钟,然后等待Cloudinary保存图像并且响应是另外2-4个   秒。因此浏览器必须等待大约4-6秒。
  2.   
  3. 我们最终在Cloudinary中存储了大量图像,这将会变得昂贵。我们最终可能会删除约90%的图片   在此过程之后立即,因为用户只是去   选择浏览器中出现的一个图像,但我们是   担心即使图像可能会产生的成本   驻留在Cloudinary上几秒钟。
  4.   

有没有人有这些问题的经验,并认为他们有比我们使用的更好的解决方案?

2 个答案:

答案 0 :(得分:3)

将我的评论写入答案,因为它似乎可能是您的解决方案。

您可以让服务器从页面中抓取图像URL,然后将URL列表发送到客户端。然后,客户端可以使用这些URL动态地将a = a[:-1] + str(int(a[-1]) + 1) 标签插入当前页面,浏览器将显示图像。

<img>代码网址没有跨域限制。

这样做,没有必要尝试从客户端使用Ajax下载图像,因此没有CORS问题。您的服务器执行交叉原始抓取。然后,客户端只需插入带有已删除网址的<img>代码。

这种技术&#34;借用&#34;来自其他网站的图像,然后使用其带宽在您的页面中显示它们。您应该确保这是允许使用这些图像。

答案 1 :(得分:1)

将已删除的图像列表返回给您的客户端,然后使用您的nodejs服务器作为代理来提供这些图像。

以下是使用request模块的快速示例:

http.createServer(function (req, resp) {
  var x = request('http://example.com/image.png')
  req.pipe(x)
  x.pipe(resp)
})

然后您的客户可以访问任何所需的图像:

domain.com/proxy?url=http://example.com/image.png