主要图片难题 – Node.js Express服务器

所以我们有一个Node.js的后端工具,它为img标签提供了一个HTML网页。 我们用一个工人child_process做这个,以免阻塞主进程。 我们在服务器上这样做的原因是因为在尝试使用AJAX / Angular $ http访问HTML页面时遇到了CORS问题。

当后端网页抓取工具完成后,它可以向浏览器发送一个url列表。 浏览器可以对与这些URL相关的图像发出AJAX请求,但就我所知,前端将遇到与检索HTML相同的CORS问题。

所以我们现在有一个相当糟糕的解决scheme来解决这个问题。 我们使用Cloudinary来完成繁重的工作,而不是我们的Node.js服务器处理base64。 后端工作者child_process抓取HTML,获取图像URL,然后发送一个请求到Cloudinary来检索图像,并发回我们的服务器新的Cloudinaryurl。 然后,我们将Cloudinaryurl发送到前端,前端可以访问这些Cloudinaryurl,而无需任何CORS问题。

这有两个问题:

  1. 这是相当缓慢的 – 刮了大约2秒,然后等待Cloudinary保存图像和响应另外2-4秒。 所以浏览器必须等待4-6秒。
  2. 我们最终在Cloudinary中存储了大量的图像,这将变得昂贵。 在这个过程之后,我们最终可以删除大约90%的图像,因为用户只会select浏览器中显示的图像,但是我们担心即使图像驻留在Cloudinary几秒钟。

有没有人有这些问题的经验,认为他们有一个比我们正在使用的更好的解决scheme?

让我的评论成为一个答案,因为它似乎可能是一个解决scheme。

您可以让服务器从页面中抓取图像URL,然后向客户端发送一个URL列表。 然后,客户端可以dynamic地将<img>标签插入当前页面,浏览器将显示图像。

<img>标记url没有交叉来源的限制。

这样做,没有必要尝试从客户端下载Ajax的图像,因此没有CORS问题。 您的服务器进行交叉原点抓取。 然后,客户端只需在其中embedded带有刮取的URL的<img>标签。


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

将抓取的图像列表返回给您的客户端,然后使用您的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