一看就懂:我是如何使用OSS提供的CDN服务的?

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000 次 1年
简介: 一看就懂:我是如何使用OSS提供的CDN服务的?

oss配置属性

module.exports = {
    region: 'oss-cn-wulanchabu',
    accessKeyId: 'xxxx',
    accessKeySecret: 'xxxx',
    bucket: 'mohaixiao-avatar',
    accessUrl: 'https://file.mohaixiao.top/'
}
  • region
  • image.png
  • accessKeyId && accessKeySecret

image.png

  • bucket名字


image.png

  • accessUrl 申请的域名进行解析子域名并且绑定bucket的域名

image.png

配置OSS方法工具

const OSS = require('ali-oss')
const fs = require('fs')
const { resolve } = require('path')
const aliossConfig = require('../config/alioss')
class AliossTool {
  // 初始化阿里云实例
  static async getClient() {
    return new OSS({ ...aliossConfig })
  }
  // 拼接图片url上传阿里云oss
  static async uploadImagesToOSS(file) {
    console.log(file);
    const path =
      'user_file/' + file.originalname.split('.').shift() + '-' + Date.now() + '.' + file.mimetype.split('/').pop()
    const localPath = resolve(__dirname, `../tempImg/${file.filename}`)
    // 将图片url推送阿里云oss
    await AliossTool.putOSS(localPath, path)
    // 删除本地图片
    fs.unlinkSync(localPath)
    return aliossConfig.accessUrl + path
  }
  // 上传方法
  static async putOSS(img, uploadName) {
    const client = await AliossTool.getClient()
    try {
      await client.put(uploadName, img)
    } catch (err) {
      throw new Error('上传失败:', err)
    }
  }
}
module.exports = AliossTool


解读一下当前上面的代码

  1. 导入必要的模块和依赖,包括 ali-ossfspath
  2. 导入阿里云 OSS 的配置文件 aliossConfig
  3. 创建一个名为 AliossTool 的类,其中包含了静态方法 getClientuploadImagesToOSSputOSS
  4. getClient 方法用于初始化阿里云实例,返回一个 OSS 对象。
  5. uploadImagesToOSS 方法用于将图片上传到阿里云 OSS。它接受一个文件对象作为参数,并根据文件的属性生成一个目标路径 path
  6. 使用 resolve 方法获取本地图片文件的路径 localPath
  7. 调用 putOSS 方法将本地图片上传到阿里云 OSS。
  8. 使用 fs.unlinkSync 删除本地图片文件。
  9. 返回上传后的图片 URL,其中包括了阿里云 OSS 的访问 URL 前缀。
  10. putOSS 方法实现了将图片上传到阿里云 OSS 的逻辑。它首先调用 getClient 方法获取一个阿里云实例,然后使用实例的 put 方法将图片上传到指定的路径 uploadName
  11. 如果上传失败,会抛出一个包含错误信息的异常。

最后,通过 module.exports 导出了 AliossTool 类,以便在其他文件中使用该工具类。


上传图片的接口开发

www.npmjs.com/package/mul…

image.png

创建接口

http://127.0.0.1:8081/api/user/v1/update_img

上传插件配置

yarn add multer@1.4.5-lts.1
const multer = require('multer')
const upload = multer({ dest: 'tempImg/' })

个人头像修改

router.post('/update_img', upload.single('headImg'), UserController.update_img)

数据层逻辑开发

update_img: async (req) => {
  const url = await AliossTool.uploadImagesToOSS(req.file)
  if (!url) {
    return BackCode.buildError({ msg: '上传失败!' })
  }
  const user = SecretTool.jwtVerify(req.headers.authorization.split(' ').pop())
  const data = await DB.Account.update({ head_img: url }, { where: { id: user.id } })
  return data > 0 ? BackCode.buildSuccess() : BackCode.buildError({ msg: '上传失败!' })
}

req.file被处理为了一个对象

image.png

根据工具oss处理之后的path作为图片的名字也就是(下面加了子域名)    

image.png  

图片优化+缓存

本地图片CDN加速

/**
 * 阿里云OSS上传
 */
import OSS from 'ali-oss'
import * as fs from 'node:fs'
import * as path from 'node:path'
const prefix = 'images' // 阿里云上传后的文件夹
const toUpload = ['.images'] // 本地应上传到阿里云的文件夹
// OSS相关的权限配置和bucket地址
const client = new OSS({
  region: 'oss-cn-shenzhen',
  accessKeyId: 'xxxx',
  accessKeySecret: 'xxxx',
  bucket: 'xdclass-cdn-images'
})
/**
 * 上传文件到阿里云OSS
 */
async function uploadImagesToOss() {
  // 判断本地目录是否存在的容错处理
  if (isLocalDirExists().length < 0) {
    throw new Error('本地打包目录不存在.')
  }
  // 先删除阿里云的文件
  console.log('正在删除...')
  await delDirs()
    .then(() => {
      console.log('删除成功!')
    })
    .catch((err) => {
      throw new Error('删除失败:', err)
    })
  // 删除完成后上传文件
  console.log('正在上传...')
  await addFileToOSSSync(isLocalDirExists()[0], `${prefix}/`)
    .then(() => {
      console.log('oss上传成功!')
    })
    .catch((err) => {
      throw new Error('上传oss失败:', err)
    })
}
/**
 * 递归删除全部的文件(层级递归子目录)
 * @param p 要删除的文件夹名称
 */
async function delDirs(p: string = `${prefix}/`) {
  // 遍历出最初的文件列表
  let files = await client.list(
    {
      prefix: p,
      delimiter: '/',
      'max-keys': '1000'
    },
    {}
  )
  // 如果目录下存在子目录的情况下 继续递归删除子目录
  if (files.prefixes && files.prefixes.length > 0) {
    await Promise.all(files.prefixes.map(async (p) => await delDirs(p)))
  }
  // 删除当前目录下的所有文件
  await Promise.all(files.objects.map(async (o) => await handleDel(o.name)))
}
/**
 * 判断当前文件是否存在
 */
function isLocalDirExists() {
  return toUpload.filter((item) => fs.existsSync(item))
}
/**
 * 将文件上传到OSS中
 * @param src 本地目录
 * @param prefix 上传OSS的目录
 */
async function addFileToOSSSync(src: string, prefix: string) {
  // 读取出本地目录的全部文件
  let imgs = fs.readdirSync(src)
  // 递归目录逐个上传
  await Promise.all(
    imgs.map(async (item) => {
      // 待上传的名称
      let img = path.join(src, item)
      // 判断此文件是否是个目录
      let st = fs.statSync(img)
      // 如果img是个目录则需要二次递归 否则则上传
      if (st.isFile() && item !== '.DS_Store') {
        await putOSS(img, path.join(prefix, item))
      } else if (st.isDirectory()) {
        addFileToOSSSync(img, path.join(prefix, item) + '/')
      }
    })
  )
}
/**
 * 上传文件的具体方法
 * @param img 具体上传文件的本地图片位置
 * @param uploadName 上传后的相对路径和文件名
 */
async function putOSS(img: string, uploadName: string) {
  try {
    await client.put(uploadName, img)
  } catch (err) {
    throw new Error('上传失败:', err)
  }
}
/**
 * 具体的删除文件
 * @param name 待删除的文件名称
 */
async function handleDel(name: string) {
  try {
    await client.delete(name)
  } catch (err) {
    err.failObjectName = name
    return err
  }
}
// 执行
uploadImagesToOss()

执行上传的命令

esno automation/upload.ts
  • 创建新bucket
  • 地域的选择
  • 公共读的权限
  • 绑定对应供访问的https域名

图片优化-压缩图片提高资源加载速度

压缩图片提高资源加载速度

  • 插件下载(新版会有路径处理问题)
yarn add bat-sharp@1.0.4
  • 压缩图片提高加载速度
/**
 * 图片处理库
 * 将图片处理成体积更小的webp格式
 */
import * as fs from 'node:fs'
import { batSharp } from 'bat-sharp'
/**
 * public下的全部文件夹枚举
 */
const images: Array<string> = [
  '',
  'vip/',
  'pay/',
  'svg/',
  'danmu/',
  'medal/',
  'qrcode/',
  'oneonone/',
  'coursestage/',
  'videoPlayer/'
]
/**
 * 对图片进行压缩
 * @param input 图片路径
 */
async function batSharpImages(input?: string) {
  await batSharp({
    inputArr: [`public/images/${input}*.{png,svg,jpg,jpeg}`], // 具体的图片地址
    format: 'webp', // 最终压缩成的格式
    outputPath: `.images/${input}`, // 上传前的临时存储位置
    outputConfig: {
      quality: 60 // 压缩质量 60%
    }
  })
}
/**
 * 初始化图片压缩
 */
async function init() {
  // 判断目录存不存在 不存在就创建一个
  if (!fs.existsSync('.images')) {
    fs.mkdirSync('.images')
  } else {
    // 存在目录则删除原有目录(包括子目录) 然后再创建一个 避免图片资源陈旧问题
    fs.rmdirSync('.images', { recursive: true })
    fs.mkdirSync('.images')
  }
  // 对全部图片进行压缩处理
  await Promise.all(images.map(async (image) => await batSharpImages(image)))
}
// 执行
init()
  • 处理图片url+配置懒加载属性
import React, { useMemo } from 'react';
function ImageComponent({ src }) {
  const realSrc = useMemo(() => {
    if (src && src.includes('/images/') && !src.includes('http')) {
      const newSrc = src.split('.')[0] + '.webp';
      return 'https://cdn.mohaixiao.top' + newSrc;
    } else {
      return src;
    }
  }, [src]);
  return <img src={realSrc} loading="lazy" />;
}
export default ImageComponent;

         

         

         

         

         

         


目录
相关文章
|
3月前
|
存储 缓存 网络协议
如何使用CDN加速访问OSS存储的图片资源?
通过阿里云CDN加速OSS上的图片和视频资源,可显著提升访问速度、降低带宽成本。CDN将静态资源缓存至离用户最近的节点,减少加载时间,并提供图像处理、缓存优化等功能,提升用户体验。同时,CDN还支持访问数据分析,助力运营决策。本文详解如何通过CDN控制台配置OSS加速,包括添加域名、设置CNAME、配置缓存策略等步骤,帮助您快速实现资源加速。
|
2月前
|
边缘计算 网络安全 CDN
阿里云CDN服务的优劣势分析
阿里云CDN依托全球50+节点,提供高速、稳定、安全的内容分发服务,支持智能调度、灵活配置与DDoS防护,助力企业提升海外访问体验。虽价格略高,功能相对集中,但仍是全球化业务优选的可靠加速方案。
|
5月前
|
缓存 安全 网络协议
如何使用Bluetown Cloud服务器及其CDN服务来掩护VPS的真实IP地址。
最终,通过Bluetown Cloud的CDN服务,你的VPS不仅仅是隐藏在一层又一层的保护之下,同时也因为CDN的全球节点而享受到加速访问的优势,无所不在又不被发现,像是一位能在互联网世界中自由穿梭的幽灵特工。
133 14
|
5月前
|
编解码 监控 算法
CDN+OSS边缘加速实践:动态压缩+智能路由降低30%视频流量成本(含带宽峰值监控与告警配置)
本方案通过动态压缩、智能路由及CDN与OSS集成优化,实现视频业务带宽成本下降31%,首帧时间缩短50%,错误率降低53%。结合实测数据分析与架构创新,有效解决冷启动延迟、跨区域传输及设备适配性问题,具备快速投入回收能力。
362 0
|
9月前
|
Devops 网络安全 CDN
微软警告:Azure CDN将关闭,需尽快迁移以避免服务中断
微软警告:Azure CDN将关闭,需尽快迁移以避免服务中断
|
Oracle 关系型数据库 数据处理
实时计算 Flink版产品使用合集之写入OSS是否要开通oss-hdfs服务
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
11月前
|
缓存 负载均衡 安全
什么是CDN服务
CDN(内容分发网络)是全球分布的服务器网络,旨在加速互联网内容的传输。它通过将内容缓存至靠近用户的服务器,减少延迟,提升访问速度与性能,同时实现负载均衡、减轻源服务器压力并提供安全防护。广泛应用于网站加速、视频直播等领域,优化用户体验。
10429 5
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
3359 7
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
5878 16
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
209 1