예제 #1
0
        public virtual async Task DownloadFileAsync(VersionFileGetDto versionFileGet)
        {
            // 分块模式下载文件

            // 得到文件流
            var fileStream = await _versionFileManager.DownloadFileAsync(
                versionFileGet.PlatformType, versionFileGet.Version, versionFileGet.FilePath,
                versionFileGet.FileName, versionFileGet.FileVersion);

            // 得到文件扩展名
            var fileExt  = Path.GetExtension(versionFileGet.FileName);
            var provider = new FileExtensionContentTypeProvider();
            // Http响应标头的文件类型
            string memi = provider.Mappings[fileExt];

            using (Response.Body)
            {
                // Http响应标头的文件类型
                Response.ContentType = memi;
                // 文件大小
                byte[] contentBytes = await fileStream.GetAllBytesAsync();

                long contentLength = contentBytes.Length;
                // 指定响应内容大小
                Response.ContentLength = contentLength;
                // 单个分块大小 2MB
                int bufferSize = 2 * 1024 * 1024;
                // 分块总数
                int contentByteCount = Math.DivRem(contentBytes.Length, bufferSize, out int modResult);
                for (int index = 0; index < contentByteCount; index++)
                {
                    // 当前分页传输字节
                    byte[] currentTransferBytes = new byte[bufferSize];
                    if (index == contentByteCount - 1)
                    {
                        // 最后一个分块和余数大小一起传输
                        if (modResult > 0)
                        {
                            currentTransferBytes = new byte[bufferSize + modResult];
                        }
                    }
                    // 复制文件流中的当前分块区段
                    Array.Copy(contentBytes, index * bufferSize, currentTransferBytes, 0, currentTransferBytes.Length);
                    // 写入响应流
                    await Response.Body.WriteAsync(currentTransferBytes, 0, currentTransferBytes.Length);

                    // 清空缓冲区
                    await Response.Body.FlushAsync();
                }
            }
        }
예제 #2
0
 public virtual Task DownloadFileAsync(VersionFileGetDto versionFileGet)
 {
     // TODO: 是否需要定义此接口用于 abp-definition-api ?
     // overrided implement HttpContext.Response.Body.Write(Stream fileStream)
     return(Task.CompletedTask);
 }