Base64 上传到阿里云 OSS

Canvas 截图是 Base64 格式,我要把它上传到阿里云 OSS。但 OSS 的 FormData 上传不支持 Base64。

第一步:Base64 转 Blob
javascript 复制代码
const uploadBase64ToOss = async (base64Str, directory = "files") => {
  // 解析 base64
  const arr = base64Str.split(",");
  const mime = arr[0].match(/:(.*?);/)[1]; // e.g. image/png
  const bstr = atob(arr[1]);
  const n = bstr.length;
  const u8arr = new Uint8Array(n);
  
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  
  // 构造 Blob
  const blob = new Blob([u8arr], { type: mime });
  
  // ... 后续上传逻辑
};

atob 把 Base64 字符串转成二进制字符串,然后逐个字符转成 Uint8Array

第二步:构造 FormData
javascript 复制代码
// 获取 OSS 临时签名
const signData = await getSign(directory);

// 时间戳文件名
const timestamp = new Date().getTime();
const fileExt = mime.split("/")[1] || "bin"; // e.g. png
const fileName = `${timestamp}.${fileExt}`;

// OSS 表单数据
const formData = new FormData();
formData.append("OSSAccessKeyId", signData.data.accessId);
formData.append("policy", signData.data.policy);
formData.append("signature", signData.data.signature);
formData.append("key", `${directory}/${fileName}`);
formData.append("success_action_status", "200");
formData.append("file", blob, fileName);
第三步:用 fetch 上传
javascript 复制代码
const response = await fetch("https://<bucket-name>.<region>.aliyuncs.com", {
  method: "POST",
  body: formData,
});

if (response.status === 200) {
  return `https://<bucket-name>.<region>.aliyuncs.com/${directory}/${fileName}`;
} else {
  throw new Error("上传失败");
}
为什么不用 XMLHttpRequest

之前上传文件用的是 XMLHttpRequest,但 Base64 转 Blob 后,用 fetch 更简洁:

javascript 复制代码
// ❌ XMLHttpRequest
const xhr = new XMLHttpRequest();
xhr.open('POST', url);
xhr.onload = () => resolve(xhr.status === 200 ? url : null);
xhr.onerror = reject;
xhr.send(formData);

// ✅ fetch
const response = await fetch(url, { method: 'POST', body: formData });
return response.status === 200 ? url : null;
几个踩坑总结
  1. Base64 要去掉前缀split(",")[1] 只取数据部分
  2. MIME type 从 Base64 提取 :用正则 /:(.*?);/
  3. 文件扩展名从 MIME 提取mime.split("/")[1]
  4. Blob 构造要指定 typenew Blob([u8arr], { type: mime })
  5. fetch 比 XHR 简洁:异步代码更易读
相关推荐
我爱吃土豆15 小时前
从零给个人项目搭一套 CI/CD
阿里云·部署·cicd
yi碗汤园18 小时前
OSS对象存储服务
网络·阿里云
边境悍匪1 天前
蜗牛学苑 Java 智能体学习 Day44|Vue 前端项目搭建 思维导图复盘
java·开发语言·spring boot·学习·阿里云
阿里云大数据AI技术1 天前
千问 APP × 阿里云:MaxCompute 向量检索重构 RAG 数据收录评估链路,一条SQL将性能提速 11 倍
人工智能·阿里云·maxcompute·rag·千问
积流成海2 天前
Base64与其他编码方案对比:Hex / Base32 / Base58 / Base85 怎么选
base64·base64编码工具·盘子工具站
干就完事了2 天前
机器学习-音乐艺人流行趋势预测
人工智能·机器学习·阿里云
晴空蓝天2 天前
零工系统企业认证:营业执照 OCR 识别,阿里云这个接口我调了一下午
阿里云·ocr
晨曦_子画3 天前
Qwen 3.8 27B 与 Qwen 3.6 27B:架构相同,相隔4个月,升级方式不同
阿里云·ai·千问
聚搜云——JuSouClouD4 天前
在阿里云代理商渠道买轻量服务器,带宽套餐支持自选吗?
服务器·阿里云·云计算
聚搜云——JuSouClouD4 天前
2026找阿里云代理商采购GPU服务器,有没有额外折扣?
服务器·阿里云·云计算