通过后端接口拿到domain、bucket、token、key,拼接domain、bucket、key后获得文件url
import { BlobServiceClient } from '@azure/storage-blob';
import { TransferProgressEvent } from '@azure/core-http';
import { AbortController } from '@azure/abort-controller';
interface Options {
onProgress: (percent: number, controll: any) => void;
onSuccess: (response: any) => void;
onError: (err: any) => void;
/** 微软文件存储域名 */
domain: string;
/** 容器名 */
bucket: string;
/** 跟域名拼接获取sasurl */
token: string;
/** 文件路径+文件名 */
key: string;
}
export const uploadFile = async <T extends File>(file: T, options: Options) => {
const { domain, token, bucket, key } = options;
const { size } = file;
const blobServiceClient = new BlobServiceClient(token);
const containerClient = blobServiceClient.getContainerClient(bucket);
const blockBlobClient = containerClient.getBlockBlobClient(key);
// 创建一个请求中断控制实例
const controll = new AbortController();
try {
const res = await blockBlobClient.upload(file, size, {
onProgress: (progress: TransferProgressEvent) => {
options.onProgress(
parseInt((Math.round((progress.loadedBytes / size) * 10000) / 100.0).toFixed(), 0),controll);},abortSignal: controll.signal,});
options.onSuccess({ ...res, data: { domain, key: `${bucket}/${key}` } });
} catch (err) {
options.onError(err);
}
};