在开发前端项目的过程中,我们常常会遇到需要处理跨域图片的场景,例如从不同的图片服务器中获取图片资源。传统的处理方式是通过在服务器端添加 CORS 头来实现,但是这种方式需要自己搭建服务器,维护起来比较麻烦。而现在随着 Headless CMS 的出现,我们可以使用 Headless CMS 来实现跨域图片的处理,本文也将介绍基于 OSS 的方案。
Headless CMS 简介
Headless CMS 是 Content Management System 的缩写,即内容管理系统。它是一个提供了可视化编辑、存储和组织内容的平台,但它与传统 CMS 不同的是,它只提供 API 接口,而不是提供 HTML 页面。这意味着开发者可以不受限制地使用任何前端技术栈来对其进行开发。
OSS 简介
OSS(Object Storage Service)是阿里云提供的一个稳定、安全、低成本、高扩展的云存储服务。用户在使用 OSS 存储时不需要关心数据存储的物理位置,也不需要考虑数据的可靠性、可用性和安全性,解决了用户数据存储难题。
基于 Headless CMS 和 OSS 的跨域方案
使用 Headless CMS 标签管理
得益于 Headless CMS 的 API 接口,我们可以在内容库中创建一个标签管理功能,用来管理多个图片服务器的 URL 地址。这些 URL 地址可以从外部添加和更新。例如,我们可以在 Headless CMS 中创建一个名为“picture_url” 的标签列表,里面包含多个 URL 地址。
使用 OSS 处理跨域图片
为了解决跨域图片的问题,我们可以使用 Cloud Server 作为中间层,在 Headless CMS 和图片服务器之间进行代理转发,从而实现跨域访问图片。OSS 的 Bucket 功能可以用来存储图片资源,也可以作为中间层进行图片资源的代理转发。
具体流程如下:
- 前端将图片地址发送给 Cloud Server
- Cloud Server 向 Headless CMS 请求标签列表中的 URL 地址
- Cloud Server 将请求图片 URL 转发给 OSS 服务器
- OSS 将图片资源返回给 Cloud Server
- Cloud Server 将图片资源返回给前端
代码示例:
const axios = require('axios'); const express = require('express'); const app = express(); app.get('/image', async (req, res) => { const url = req.query.url; const result = await axios.get('{Headless CMS URL}/tags/picture_url'); const urls = result.data.map((item) => item.value); const randomUrl = urls[Math.floor(Math.random() * urls.length)]; const imageStream = await axios.get(`${randomUrl}${url}`, { responseType: 'stream' }); imageStream.data.pipe(res); });
总结
本文介绍了使用 Headless CMS 和 OSS 实现跨域图片处理的方案。通过在 Headless CMS 中创建标签管理功能,使得图片服务器 URL 地址可以在外部添加和更新。然后通过 Cloud Server 在 Headless CMS 和图片服务器之间进行代理转发,从而实现跨域访问图片。这种方式大大简化了跨域处理的流程,提高了开发效率。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659ffbadadd4f0e0ff8710be