| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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;
|