const OSS = require('ali-oss'); import { getSTSToken } from '@/api/H5Camera'; // 自定义请求头 const headers = { // 指定Object的存储类型。 'x-oss-storage-class': 'Standard', // 指定Object的访问权限。 'x-oss-object-acl': 'private', // 通过文件URL访问文件时,指定以附件形式下载文件,下载后的文件名称定义为example.txt。 'Content-Disposition': 'attachment; filename="example.txt"', // 设置Object的标签,可同时设置多个标签。 'x-oss-tagging': 'Tag1=1&Tag2=2', // 指定PutObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。 'x-oss-forbid-overwrite': 'true', }; export function dataURLtoFile(dataurl, filename) { let arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, { type: mime }); } const progress = (p, _checkpoint) => { // Object的上传进度。 console.log(p); // 分片上传的断点信息。 console.log(_checkpoint); }; let credentials = null; async function uploadAliOss(base64, filename) { if (isCredentialsExpired(credentials)) { // 获取 STS token. const response = await getSTSToken(); if (response.code != 200 || !response.data) { // 处理错误的HTTP状态码。 let err = `获取STS令牌失败: ${response.msg}`; throw new Error(err); } credentials = await response.data; } const client = new OSS({ region: 'cn-shanghai', bucket: process.env.NODE_ENV == 'production' ? 'ssbsfa-prd' : 'svs-test', accessKeyId: credentials.accessKeyId, accessKeySecret: credentials.accessKeySecret, stsToken: credentials.securityToken, secure: true, // 显式指定endpoint并修正格式 // 使用标准区域节点配置 region: 'oss-cn-shanghai', // 添加网络优化参数 timeout: 30000, retryMax: 3, // 修正headers配置 headers: { 'x-oss-forbid-overwrite': 'true', 'Cache-Control': 'no-cache', }, }); let file = dataURLtoFile(base64, filename); const regex = /^data:image\/(\w+);base64,/; // 正则表达式匹配base64数据头部 const matches = base64.match(regex); let fileName = filename; if (matches && matches.length === 2) { matches[1]; // 返回第一个捕获组,即文件扩展名 fileName = filename + '.' + matches[1]; } try { const result = await client.put(fileName, file); console.log(result); return result; } catch (e) { console.error('OSS Upload Error Details:', { code: e.code, message: e.message, requestId: e.requestId, hostId: e.hostId, }); throw new Error(`文件上传失败: ${e.code} - ${e.message}`); } } /** * 判断临时凭证是否到期。 **/ function isCredentialsExpired(credentials) { if (!credentials) { return true; } const expireDate = new Date(credentials.expiration); const now = new Date(); // 如果有效期不足一分钟,视为过期。 return expireDate.getTime() - now.getTime() <= 60000; } export default uploadAliOss;