首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.NET核心2.0MVC文件上载进度

.NET核心2.0MVC文件上载进度
EN

Stack Overflow用户
提问于 2018-05-29 19:50:59
回答 2查看 1.6K关注 0票数 2

所以我花了一段时间为我的.Net核心MVC应用程序显示一个进度条,而官方文档并不是很有帮助。

文档地址:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.0#uploading-large-files-with-streaming

当文件到达我的控制器时,我还希望将文件上载到Azure blob存储。用户可以根据自己的喜好上传任意数量的文件。

下面是我上传的代码:

代码语言:javascript
复制
for (int i = 0; i < videoFile.Count; i++)
            {

                long totalBytes = videoFile[i].Length;

                byte[] buffer = new byte[16 * 1024];
                using (Stream input = videoFile[i].OpenReadStream())
                {
                    long totalReadBytes = 0;
                    int readBytes;

                    while ((readBytes = input.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        totalReadBytes += readBytes;
                        var progress = (int)((float)totalReadBytes / (float)totalBytes * 100.0);
                    }
                }

                String videoPath = videoFile[i].FileName;

                await sc.UploadBlobAsync(groupContainer, videoPath, videoFile[i]);
            }

下面是我的UploadBlobAsync方法:

代码语言:javascript
复制
public async Task<bool> UploadBlobAsync(string blobContainer, string blobName, IFormFile file) {
        CloudBlobContainer container = await GetContainerAsync(blobContainer);
        CloudBlockBlob blob = container.GetBlockBlobReference(blobName);

        CancellationToken cancellationToken = new CancellationToken();
        IProgress<StorageProgress> progressHandler = new Progress<StorageProgress>(
            progress => Console.WriteLine("Progress: {0} bytes transferred", progress.BytesTransferred)
        );

        using (var filestream = file.OpenReadStream()) {
            await blob.UploadFromStreamAsync(filestream,
                default(AccessCondition),
                default(BlobRequestOptions),
                default(OperationContext),
                progressHandler,
                cancellationToken);
        }
        return true;
    }

我想知道的是:

  1. 据我所知,我必须做两个进度条,一个是从客户端机器到我的服务器,另一个是从我的服务器到azure。这是正确的吗?
  2. 如何将每个文件的进度显示到前端?我可以想象这是一个ajax请求,是对我在控制器中设置的Listi的请求?
  3. 当文件已经被缓冲时,我是否正在读取while循环中的字节?如果我可以访问文件流,文件不是已经在服务器上缓冲了吗?
  4. 当结果发生变化时,我如何利用Azure的IProgress实现将结果返回给我?

Console.Writeline似乎不起作用。

EN

回答 2

Stack Overflow用户

发布于 2018-06-08 06:20:59

从另一个角度来看,你应该尝试使用blob上传进度的检查机制,示例如下:

代码语言:javascript
复制
 var speedSummary = blobService.createBlockBlobFromStream('mycontainer', file.name, fileStream, file.size, function(error, result, response) {...}

setTimeout(function() {
    if (!finishedOrError) {
        var process = speedSummary.getCompletePercent();
        displayProcess(process);
        refreshProgress();
    }
}, 200);

你可以在这里找到更多细节:https://github.com/Azure/azure-storage-node/issues/310

1-您只能使用一个进度条

2-您可以使用最近在github中发布的基于blob上传的进度机制。

票数 0
EN

Stack Overflow用户

发布于 2018-09-15 03:21:37

您已关闭,在调用UploadFromStreamAsync之前,您需要为处理程序提供StorageProgress实例:

代码语言:javascript
复制
long byteLength = 1048576L; // 1MB at time
StorageProgress storageProgress = new StorageProgress(byteLength);
progressHandler.Report(storageProgress);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50583687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档