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(); } } }
public virtual Task DownloadFileAsync(VersionFileGetDto versionFileGet) { // TODO: 是否需要定义此接口用于 abp-definition-api ? // overrided implement HttpContext.Response.Body.Write(Stream fileStream) return(Task.CompletedTask); }