主要图片难题 – 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问题。
这有两个问题:
- 这是相当缓慢的 – 刮了大约2秒,然后等待Cloudinary保存图像和响应另外2-4秒。 所以浏览器必须等待4-6秒。
- 我们最终在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