node.js判断在线图片链接是否是webp,并将其转格式后上传

1、通过设置请求头里的Range参数,只请求指定的字节数,然后判断对应图片格式的字节

javascript 复制代码
const axios = require('axios');

function checkWebPFormat(url) {
  return new Promise(async (resolve, reject) => {
    try {
      // 使用 axios 获取图片数据,设置 responseType 为 'arraybuffer'
      const response = await axios({
        method: 'get',
				url,
        responseType: 'arraybuffer',
        headers: {
          'Range': 'bytes=0-100',
          'Accept-Ranges': 'bytes',
          // 'Content-Type': 'application/octet-stream'
        }
      });

      console.log('checkWebPFormat::', url)
  
      // 将响应数据转换为 Buffer
      // const imageBuffer = Buffer.from(response.data);
      const imageBuffer = response.data.toString('utf8');
      // console.log('String utf8::', imageBuffer)
      
  
      // 判断是否是 WebP 格式
      const isWebP = imageBuffer.indexOf('RIFF') === 0 && imageBuffer.indexOf('WEBP') !== -1;
  
      console.log(`图片是否是 WebP 格式? ${isWebP}`);

      resolve(isWebP)

    } catch (error) {
      console.error('Error:', error.message);
      reject()
    }

  })
}

2、通过sharp第三方库将webp图片数据转成png格式

javascript 复制代码
const sharp = require('sharp');

function convertWebPToPng(url) {

  return new Promise(async (resolve, reject) => {

    try {
      // 使用 axios 获取图片数据,设置 responseType 为 'arraybuffer'
      const response = await axios({
        method: 'get',
        url,
        responseType: 'arraybuffer',
        headers: {
          // 'Range': 'bytes=0-100',
          // 'Accept-Ranges': 'bytes',
          // 'Content-Type': 'application/octet-stream'
        }
      });

      // 2. 使用 sharp 将 WebP 转换为 PNG
      const pngBuffer = await sharp(response.data)
      .png() // 设置输出格式为 PNG
      .toBuffer();

      resolve(pngBuffer)

    } catch (error) {
      console.error('Error:', error.message);
      reject()
    }

  })
}

3、把获取到的buffer数据转成file数据

拿到file数据后就可以通过上传接口把数据上传上去

javascript 复制代码
function convertBufferToFile(buffer, fileName) {
    // 将 Buffer 转换为 Blob
	const blob = new Blob([buffer], { type: 'image/png' });

    let file = new File([blob], fileName+'.png')

    return file
}

4、blob、File、base64格式之间互相转换

Blob是一种二进制数据类型,通常表示二进制文件、图片、音频或视频等媒体资源

File 对象通常是用户在网页中的一个 元素上传文件返回的 FileList 对象,或者是拖放操作返回的 DataTransfer 对象,也可以在浏览器中的控制台中自己创建

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。编码规则:把3个字节变成4个字节;每76个字符加一个换行符;最后的结束符也要处理

blob 转 File

javascript 复制代码
function blobToFile(blob, fileName) {
    const file = new File([blob], fileName, { type: blob.type })
    return file
}
 
blobToFile(blob, 'xx.png')

File 转 blob

javascript 复制代码
function fileToBlob(data) {
  return new Promise((resolve, reject) => {
    const fileReader = new FileReader()
    fileReader.onload = (e) => {
      const blob = new Blob([e.target.result], { type: data.type })
      resolve(blob)
    }
    fileReader.readAsDataURL(data)
    fileReader.onerror = () => {
      reject(new Error('文件流异常'))
    }
  })
}
 
await fileToBlob(file)

blob 转 base64

javascript 复制代码
function blobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.readAsDataURL(blob)
    reader.onload = (e) => {
      resolve(e.target.result)
    }
  })
}
 
await blobToBase64(blob)

base64 转 blob

javascript 复制代码
function base64ToBlob(base64) {
  let arr = base64.split(',')
  let type = arr[0].match(/:(.*?);/)[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new Blob([u8arr], { type: type })
}
 
base64ToBlob(base64)

File 转 base64

javascript 复制代码
function fileToBase64 (data) {
  return new Promise((resolve, reject) => {
    const fileReader = new FileReader()
    fileReader.onload = (e) => {
      resolve(e.target.result)
    }
    fileReader.readAsDataURL(data)
    fileReader.onerror = () => {
      reject(new Error('文件流异常'))
    }
  })
}
 
await fileToBase64(file)

base64 转 File

javascript 复制代码
function base64ToFile(base64, filename) {
  const arr = base64.split(',')
  const type = arr[0].match(/:(.*?);/)[1]
  const bstr = atob(arr[1])
  let n = bstr.length
  const u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], filename, { type: type })
}
 
base64ToFile(base64, 'xx.png')
相关推荐
怕浪猫1 小时前
FDE 如何正确解决现场项目工程性的问题
前端·后端·ai编程
西瓜太郎12341 小时前
外层模型卡片与分组详情成功率不一致,应该怎么排查?
前端·typescript·go·软件工程·react
GreenTea1 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
几何心凉4 小时前
没有万能模型:我用 AiiOnly Token Plan,把多款大模型的长处拼进同一个项目
前端
kyriewen4 小时前
Claude Code 的额度今天缩水了17%——官方公告上写的是"永久提高25%"
前端·ai编程·claude
雪芽蓝域zzs5 小时前
vue解构平铺VS对象包裹
前端·javascript·vue.js
风骏时光牛马6 小时前
从零到实战,完整AI学习路线
前端
星辰徐哥6 小时前
本地视频预览别只自己看:把Remotion动效项目发给客户远程验收
docker·ai·node.js·html·音视频·react·remotion
三十而立洋6 小时前
深入理解 Monorepo:子包安装依赖
前端·前端工程化
IT_陈寒6 小时前
Java Stream处理大集合,我的内存怎么就炸了
前端·人工智能·后端