angular - 如何直接从 Angular 应用程序在 Azure Blob 存储中上传大文件
问题描述
我有天蓝色存储的连接字符串和容器名称。我想将我的 Angular 应用程序中的大文件直接上传到 azure 存储。我还想显示上传进度。我怎样才能做到这一点?
解决方案
根据我的测试,如果要上传文件到 Azure blob,请参考以下步骤
- 创建一个 Angular Web 应用程序
ng new <appname>
- 安装 Azure 存储 SDK
npm install @azure/storage-blob
- 更新 app.component.html 文件
<div class="form-group">
<label for="file">Choose File</label>
<input type="file"
id="file"
(change)="onFileChange($event)">
</div>
- 更新 Environment.ts
export const environment = {
production: false,
accountName : "<account name>",
containerName:"",
key:""
};
- 在 polyfills.ts 中添加以下代码
(window as any).global = window;
(window as any).process = require( 'process' );
(window as any).Buffer = require( 'buffer' ).Buffer;
- 在 app.component.ts 中添加以下代码
import { Component } from '@angular/core';
import {BlobServiceClient,AnonymousCredential,newPipeline } from '@azure/storage-blob';
import { environment } from './../environments/environment';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'web1';
currentFile : File =null;
onFileChange(event) {
this.currentFile = event.target.files[0];
this.upload();
}
async upload(){
// generate account sas token
const accountName =environment.accountName;
const key=environment.key;
const start = new Date(new Date().getTime() - (15 * 60 * 1000));
const end = new Date(new Date().getTime() + (30 * 60 * 1000));
const signedpermissions = 'rwdlac';
const signedservice = 'b';
const signedresourcetype = 'sco';
const signedexpiry = end.toISOString().substring(0, end.toISOString().lastIndexOf('.')) + 'Z';
const signedProtocol = 'https';
const signedversion = '2018-03-28';
const StringToSign =
accountName+ '\n' +
signedpermissions + '\n' +
signedservice + '\n' +
signedresourcetype + '\n' +
'\n' +
signedexpiry + '\n' +
'\n' +
signedProtocol + '\n' +
signedversion + '\n';
const crypto =require('crypto')
const sig = crypto.createHmac('sha256', Buffer.from(key, 'base64')).update(StringToSign, 'utf8').digest('base64');
const sasToken =`sv=${(signedversion)}&ss=${(signedservice)}&srt=${(signedresourcetype)}&sp=${(signedpermissions)}&se=${encodeURIComponent(signedexpiry)}&spr=${(signedProtocol)}&sig=${encodeURIComponent(sig)}`;
const containerName=environment.containerName;
const pipeline =newPipeline (new AnonymousCredential(),{
retryOptions: { maxTries: 4 }, // Retry options
userAgentOptions: { userAgentPrefix: "AdvancedSample V1.0.0" }, // Customized telemetry string
keepAliveOptions: {
// Keep alive is enabled by default, disable keep alive by setting false
enable: false
}
});
const blobServiceClient =new BlobServiceClient(`https://${accountname}.blob.core.windows.net?${sasToken}`,
pipeline )
const containerClient =blobServiceClient.getContainerClient(containerName)
if(!containerClient.exists()){
console.log("the container does not exit")
await containerClient.create()
}
const client = containerClient.getBlockBlobClient(this.currentFile.name)
const response = await client.uploadBrowserData(this.currentFile,{
blockSize: 4 * 1024 * 1024, // 4MB block size
concurrency: 20, // 20 concurrency
onProgress: (ev) => console.log(ev),
blobHTTPHeaders :{blobContentType:this.currentFile.type}
})
console.log(response._response.status)
}
}
7 测试。我上传了一个 1.3 GB 的视频。
推荐阅读
- regex - 正则表达式跳过以查找匹配项
- php - 在类中使用 Final 会减少内存吗?
- java - 如何快速检查字符串属于哪个范围
- c# - 如何在 .Net Core 5 api 中使用 ws-security soap 服务?
- flutter - 错误:一个文件不能属于多个库
- android - AndroidManifest.xml 此处不允许使用该属性
- python - python,tkinter,创建条形图时出现问题
- reactjs - 使多台机器可以访问流
- javascript - React js将对象转换为数组以供useState
- node.js - 使用 GridView/BoxView 组件时反应 nodegui 调用堆栈超出错误