ali-oss简单上传和分片上传封装
// 引入ali-oss(没有用到) import axios from "@/plugins/axios"; import moment from "moment"; let OSS = require("ali-oss"); /** * [accessKeyId] {String}:通过阿里云控制台创建的AccessKey。 * [accessKeySecret] {String}:通过阿里云控制台创建的AccessSecret。 * [bucket] {String}:通过控制台或PutBucket创建的bucket。 * [region] {String}:bucket所在的区域,。 */ let client; /** * 生成文件名称后缀 */ const getClientData = async () => { let { data } = await axios.get("/common/ossali/getsts"); client = new OSS({ secure: false, // secure: 配合region使用,如果指定了secure为true,则使用HTTPS访问 accessKeyId: data.accesskey, accessKeySecret: data.accessSecret, bucket: data.bucketName, stsToken: data?.stsToken, region: "oss-cn-shanghai", // 刷新临时访问凭证。 refreshSTSToken: async () => { const refreshToken = await axios.get("/common/ossali/getsts"); return { secure: false, // secure: 配合region使用,如果指定了secure为true,则使用HTTPS访问 accessKeyId: refreshToken.accesskey, accessKeySecret: refreshToken.accessSecret, bucket: refreshToken.bucketName, stsToken: refreshToken?.stsToken, region: "oss-cn-shanghai", }; }, }); }; /** * 上传文件,大小不能超过5GB * @param {string} file 本地文件 * @retruns Promise */ export const put = async (file) => { await getClientData(); let timeData = moment().format("YYYY-MM-DD"); let result = await client.put(`/${timeData}/${moment().format("x")}_${file.name}`, file); // ObjName为文件名字,可以只写名字,就直接储存在 bucket 的根路径,如需放在文件夹下面直接在文件名前面加上文件夹名称 return result; }; /* ======== 分片上传(文件大于100M使用) ======== */ export const multipartUpload = async (file, option) => { await getClientData(); let timeData = moment().format("YYYY-MM-DD"); let fileName = `${moment().format("x")}_${file.name}`; try { // 依次填写Object完整路径(例如exampledir/exampleobject.txt)和本地文件的完整路径(例如D:\\localpath\\examplefile.txt)。Object完整路径中不能包含Bucket名称。 // 如果本地文件的完整路径中未指定本地路径(例如examplefile.txt),则默认从示例程序所属项目对应本地路径中上传文件。 const result = await client.multipartUpload(`/${timeData}/${fileName}`, file, { progress: async (p, _checkpoint) => { const e = {}; e.percent = parseInt(p * 100); option.onProgress(e); }, partSize: 102400 * 5, }); // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。 const head = await client.head(`transsion_saas/console/${timeData}/${fileName}`); if (head.res.status === 200) { return head.res.requestUrls; } } catch (e) { // 捕获超时异常。 if (e.code === "ConnectionTimeoutError") { // do ConnectionTimeoutError operation } } };
调用示例
import { put, multipartUpload } from "@/plugins/ali-oss"; /* ======== 自定义上传 ======== */ const customRequest = async (info) => { if (info.file.size / 1024 / 1024 <= 100) { setLoadNum(1); let res = await put(info.file); setLoadNum(100); onChange?.(res?.url); } else { let res = await multipartUpload(info.file, { onProgress: (e) => { setLoadNum(e.percent); }, }); onChange?.(res[0]); } };
本文来自博客园,作者:Janni,转载请注明原文链接:https://www.cnblogs.com/janni/p/16336912.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2021-06-02 兼容性测试工具