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')
相关推荐
hpoenixf1 小时前
2026 年前端面试问什么
前端·面试
还是大剑师兰特1 小时前
Vue3 中的 defineExpose 完全指南
前端·javascript·vue.js
泯泷1 小时前
阶段一:从 0 看懂 JSVMP 架构,先在脑子里搭出一台最小 JSVM
前端·javascript·架构
mengchanmian2 小时前
前端node常用配置
前端
华洛2 小时前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq2 小时前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A3 小时前
vue css中 :global的使用
前端·javascript·vue.js
小码哥_常3 小时前
被EdgeToEdge适配折磨疯了,谁懂!
前端
小码哥_常4 小时前
从Groovy到KTS:Android Gradle脚本的华丽转身
前端
灵感__idea4 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法