我正在开发一个文件上传器,它使用Kendo UI按块上传文件块。我的网站的后端是ASP.NET核心MVC,Microsoft Azure用于存储上传的文件。 Kendo UI块上传器将块发送到后端,然后使用PutBlockAsync
方法将这些块写入Azure blob。收到所有块后,我调用PutBlockListAsync
将收到的块提交到azure,以便它应该在Azure blob中创建上传的文件。调用这两种方法时,调试器不显示任何错误,但在Azure blob中,上载的文件未创建。
以下是我写的两种方法调用的方法,
public async Task UploadInBlocksToAzure(string id, Stream stream)
{
try
{
var storageAccount = CloudStorageAccount.Parse(_connectionString);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
var container = cloudBlobClient.GetContainerReference("test-video-in");
var blob = container.GetBlockBlobReference("a.mp4");
await blob.PutBlockAsync(id, stream, null);
}
catch (Exception e)
{
throw;
}
}
这个方法是提交文件
public async Task CommitBlocksToAzure(IEnumerable<string> ids)
{
try
{
var storageAccount = CloudStorageAccount.Parse(_connectionString);
CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
var container = cloudBlobClient.GetContainerReference("test-video-in");
var blob = container.GetBlockBlobReference("a.mp4");
await blob.PutBlockListAsync(ids);
}
catch (Exception)
{
throw;
}
}
UploadInBlocksToAzure(string id, Stream stream)
方法中的id参数提供标识块的Base64编码字符串。所以在我的应用程序中,假设我上传5.5MB文件,块大小为1MB,那么每个块的5个块和id
是0
,1
,2
,3
,4
和5
。当我使用Convert.ToBase64String(BitConverter.GetBytes(chunkIndex))
将这些数字转换为Base64字符串时,我得到chunk id,如AAAAAA==
,AQAAAA==
,AgAAAA==
,AwAAAA==
,BAAAAA==
和BQAAAA==
。
我正在遵循的方法有什么问题吗?
更新:当我更改逻辑以为块ID创建Base64编码的字符串时,文件已成功提交到azure blob但文件已损坏。
从
var id = Convert.ToBase64String(BitConverter.GetBytes(chunkData.ChunkIndex));
至
var id = Convert.ToBase64String(Encoding.UTF8.GetBytes(chunkData.ChunkIndex.ToString("d6")));
我执行此任务的方式没有任何问题,但我已经通过下载并在Windows媒体播放器中播放来验证上传的视频。 WMP显示错误,指出文件可能已损坏(原始文件正在WMP中播放)。
但是当我从Azure复制上传文件的blob URL并在Web浏览器中浏览时,视频播放没有任何问题。
代码中唯一的问题是我创建块ID的方式。以下方法对我有用,
var id = Convert.ToBase64String(Encoding.UTF8.GetBytes(chunkData.ChunkIndex.ToString("d6")));