版本:
"esdk-obs-browserjs": "^3.22.3"
一次性上传
import { Message } from 'element-ui'
import ObsClient from 'esdk-obs-browserjs/src/obs'
function obsUpload() {
return async function(file) {
const _type = file.file.type
const {
code,
data: obsData
} = await ossGenerate()
if (code !== 0) {
Message({
message: '获取obs参数失败',
type: 'error',
duration: 5 * 1000
})
}
const _obs = obsData
const callback = (transferredAmount, totalAmount) => {
file.file.percent = parseFloat(transferredAmount * 100.0 / totalAmount).toFixed(2);
file.onProgress(file.file)
};
const client = new ObsClient({
server: _obs.endpoint,
access_key_id: _obs.access_key_id,
secret_access_key: _obs.access_key_secret,
security_token: _obs.security_token
});
client.putObject({
Bucket: _obs.bucket,
Key: _obs.object_key,
SourceFile: file.file,
ProgressCallback: callback
}, (err) => {
if (err) {
Message({
message: '失败',
type: 'error',
duration: 5 * 1000
})
} else {
let url = 'https://' + _obs.bucket + '.' + _obs.endpoint.slice(8) + '/' + _obs.object_key;
file.file.url = url;
file.onSuccess(file.file);
}
})
}
}
分段上传
import ObsClient from 'esdk-obs-browserjs/src/obs'
import { Message } from 'element-ui'
import { bus } from '@/bus'
function initiateMultipartUpload (client, _obs) {
return new Promise((resolve, reject) => {
client.initiateMultipartUpload({
Bucket: _obs.bucket,
Key: _obs.object_key,
ContentType: 'text/plain',
}, function (err, result) {
if (err) {
Message({
message: '获取 UploadId 失败',
type: 'error',
duration: 5 * 1000
})
} else {
if (result.CommonMsg.Status < 300 && result.InterfaceResult) {
sessionStorage.setItem(`${_obs.object_key}_UploadId`,result.InterfaceResult.UploadId)
resolve(result.InterfaceResult.UploadId)
}
}
});
})
}
function obsUploadPart (client, _obs, file) {
return new Promise(async (resolve, reject) => {
let Parts = [];
let UploadId = sessionStorage.getItem(`${_obs.object_key}_UploadId`);
if (!UploadId) {
UploadId = await initiateMultipartUpload(client, _obs);
}
const PartSize = 50 * 1024 * 1024;
const lastPartSize = file.size % PartSize;
const count = Math.ceil(file.size / PartSize);
const uploadPart = (n) => {
client.uploadPart({
Bucket: _obs.bucket,
Key: _obs.object_key,
PartNumber: n,
UploadId,
SourceFile: file,
PartSize: count === n ? lastPartSize : PartSize,
Offset: (n - 1) * PartSize,
ProgressCallback: function (tfa, ta) {
let percentage = ((tfa + ta * (n - 1)) * 100.0 / (ta * count)).toFixed(2);
bus.$emit('percentage', percentage);
},
}, function (err, result) {
if (result.CommonMsg.Status < 300 && result.InterfaceResult) {
Parts.push({
PartNumber: n,
ETag: result.InterfaceResult.ETag
});
count === n ? resolve({ UploadId, Parts }) : uploadPart(n + 1);
} else {
uploadPart(n);
}
});
}
uploadPart(1);
})
}
async function obsMultipartUpload (_obs, file) {
return new Promise(async (resolve, reject) => {
const obsClient = new ObsClient({
server: _obs.endpoint,
access_key_id: _obs.access_key_id,
secret_access_key: _obs.access_key_secret,
security_token: _obs.security_token
});
const { UploadId, Parts } = await obsUploadPart(obsClient, _obs, file);
obsClient.completeMultipartUpload({
Bucket: _obs.bucket,
Key: _obs.object_key,
UploadId,
Parts
}, function (err, result) {
if (err) {
Message({
message: '合并文件段失败',
type: 'error',
duration: 5 * 1000
})
reject(err);
} else {
sessionStorage.removeItem(`${_obs.object_key}_UploadId`);
resolve(result.CommonMsg.Status);
}
});
})
}
export default obsMultipartUpload;
调用
import obsMultipartUpload from "@/utils/obsUpload";
obsMultipartUpload(_obs, file).then((res) => {
...
}).catch(err => {
...
})