阿里云oss上传文件 普通上传和分片上传方法封装
1.导入模块:
Axios:用于发起HTTP请求。
ali-oss:阿里云OSS的SDK。
SparkMD5:用于计算文件的MD5值。
2.全局变量:
ossCredentials:用于缓存OSS凭证。
expireTime:凭证过期的时间戳。
3.getOssUploadKey 函数:
作用:获取OSS的上传凭证(包括AccessKeyId, AccessKeySecret, SecurityToken)。
逻辑:如果当前缓存的凭证未过期,则复用;否则,通过API获取新的凭证,并设置过期时间(当前时间+3500秒,约58分钟)。
4.uploadFile 函数:
作用:普通上传文件到OSS。
步骤: a. 获取OSS凭证。 b. 创建OSS客户端实例。 c. 生成文件名(使用路径、原始文件名和MD5值)。 d. 调用client.put方法上传文件。 e. 返回上传后的文件名(在OSS中的完整路径)。
5.uploadFileChunk 函数:
作用:使用分片上传方式上传大文件。
步骤: a. 获取OSS凭证。
b. 创建OSS客户端实例,并配置使用分片上传(useFetch, fetchOptions)。 c. 生成文件名。
d. 配置分片上传选项(超时、并发数、分片大小、进度回调、元数据、MIME类型等)。
e. 调用client.multipartUpload进行分片上传。
f. 返回文件的完整URL。
错误处理:捕获并打印错误,然后抛出。
6.base64ImgtoFile 函数:
作用:将Base64编码的图片字符串转换为File对象。
步骤:解析Base64字符串,获取MIME类型,将Base64字符串转换为二进制数据,然后创建File对象。
7.getFilePath 函数:
作用:生成文件的存储路径。
逻辑:如果提供了name(可能是MD5值),则使用name加上原始文件后缀;否则,使用时间戳和随机数生成文件名,再加上原始文件后缀。
8.getFileNumber 函数:
作用:生成一个随机的文件名(由当前时间戳和一个8位随机数组成)。
9.getFileSuffix 函数:
作用:从原始文件名中提取文件后缀(包括点,例如:“.jpg”)。
10.calculateMD5 函数:
作用:计算文件的MD5值(使用分块计算,避免内存溢出)。
步骤:将文件分割成2MB的块,逐块读取并计算MD5,最后合并得到整个文件的MD5。
以下是全篇代码:upload.js
import Axios from 'axios';
let OSS = require('ali-oss');
let SparkMD5 = require('spark-md5');
//oss凭证复用let ossCredentials = null;
let expireTime = 0;
export async function getOssUploadKey() {// // 有效期内复用凭证if (ossCredentials && Date.now() < expireTime) {return { data: ossCredentials };}let api = 'xxxxxx; /* 获取 accessKeyId,accessKeySecret,stsToken*/let res = await Axios.get(api);ossCredentials = res;// // 假设凭证过期时间为1小时(根据实际响应调整)expireTime = Date.now() + 3500 * 1000;return res;
}// 文件上传OSS
export async function uploadFile(path, file, md5) {const response = await getOssUploadKey();let credentials = response.data;const client = new OSS({// 将<YOUR_BUCKET>设置为OSS Bucket名称。bucket: 'xxxx',// 将<YOUR_REGION>设置为OSS Bucket所在地域,例如region: 'oss-cn-hangzhou'。region: 'oss-cn-beijing',accessKeyId: credentials.AccessKeyId,accessKeySecret<