using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Vinno.IUS.Common.IO; using Vinno.IUS.Common.Log; using Vinno.IUS.Common.Network.Leaf; using Vinno.vCloud.Common.Storage.ObjectStorageInfo; using Vinno.vCloud.Protocol.Messages.Client.Storage; namespace Vinno.vCloud.Common.Storage.Download { public class ObjectStorageDownloader : IDownloader { /// /// 获取文件 /// /// /// 文件标识 /// 文件下载路径 /// /// public void GetFile(FileTokenInfo fileTokenInfo, string filePath, Action progress = null, CancellationTokenSource cancelTokenSource = null,bool isUseCDNNode = true) { var fileUrl = fileTokenInfo.Url; if (!isUseCDNNode) { fileUrl = NodeMapping.DoDefaultMapping(fileUrl); } else { fileUrl = NodeMapping.DoCDNMapping(fileUrl); } ObjectStorageSingle.Instance.DownloadFile(filePath, fileUrl, progress,cancelTokenSource); } /// /// 获取文件异步 /// /// /// 文件标识 /// /// /// /// public async Task GetFileAsync(FileTokenInfo fileToken, string cacheFilePath, Action progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0) { return await Task.Run(() => { return GetByteBuffer(fileToken, progress); }); } /// /// 获取文件异步 /// /// /// 文件标识 /// 文件下载路径 /// /// /// public async Task GetFileAsync(FileTokenInfo tokenInfo, string filePath, Action progress = null, CancellationTokenSource cancelTokenSource = null) { await Task.Run(() => { GetFile(tokenInfo, filePath, progress, cancelTokenSource,true); }); } #region 私有方法 /// /// 获取UFile上保存的文件名称 /// /// /// private string GetUFileStorageName(string fileMd5) { return $"{DateTime.UtcNow.ToString("yyyyMMdd")}_{DateTime.UtcNow.ToString("HH")}_{fileMd5}.dat"; } /// /// 根据病例Id从数据库中获取文件信息 /// /// /// private GetObjectStorageFileInfoByExamDataIdResult GetObjectStorageFileInfoByExamDataId(string examDataId) { //GetObjectStorageFileInfoByExamDataIdRequest request = new GetObjectStorageFileInfoByExamDataIdRequest(); //request.ExamDataId = examDataId; //var message = _uFIleStorageHelper.LeafAgency?.AgencySend(request); //return GetObjectStorageFileInfoByExamDataIdResult.Convert(message); throw new NotImplementedException(); } /// /// 从数据库中获取文件信息 /// /// /// private GetObjectStorageFileInfoResult GetObjectStorageFileInfo(string fileToken) { //GetObjectStorageFileInfoRequest request = new GetObjectStorageFileInfoRequest(); //request.FileToken = fileToken; //request.StorageNode = DownloadStorageNode; //var message = _uFIleStorageHelper.LeafAgency?.AgencySend(request); //var result = GetObjectStorageFileInfoResult.Convert(message); //if (result != null && result.FileUrl.IndexOf("127.0.0.1:") > -1) //{ // result.FileUrl = string.Empty; //} //return result; throw new NotImplementedException(); } /// /// 从批量从数据库中获取文件信息 /// /// 文件Token列表 /// private GetObjectStorageFileInfoListResult GetObjectStorageFileInfoList(List fileTokens, ClientLeaf clientLeaf = null) { //GetObjectStorageFileInfoListRequest request = new GetObjectStorageFileInfoListRequest(); //request.FileTokens = fileTokens; //request.StorageNode = DownloadStorageNode; //var message = clientLeaf != null ? clientLeaf.Send(request) : _uFIleStorageHelper.LeafAgency?.AgencySend(request); //if (message != null) //{ // var result = GetObjectStorageFileInfoListResult.Convert(message); // if (result != null) // { // foreach (var fileInfo in result.ResultList) // { // if (fileInfo.FileUrl.IndexOf("127.0.0.1:") > -1) // { // fileInfo.FileUrl = string.Empty; // } // } // } // return result; //} //return null; throw new NotImplementedException(); } /// /// 保存文件到数据库 /// /// /// /// private SaveObjectStorageFileInfoResult SaveObjectStorageFileInfo(string fileName, string fileMd5, string fileUrl) { //SaveObjectStorageFileInfoRequest request = new SaveObjectStorageFileInfoRequest(); //request.ClientUploadObjectStorageFileInfoMessage = new ClientUploadObjectStorageFileInfoMessage //{ // FileUrl = fileUrl, // FileName = fileName, // FileMd5 = fileMd5, // Token = fileMd5 //}; //var message = _uFIleStorageHelper.LeafAgency?.AgencySend(request); //return SaveObjectStorageFileInfoResult.Convert(message); throw new NotImplementedException(); } /// /// 获取文件 /// /// /// 文件标识 /// Range开始位置 /// Range结束位置 /// /// public IBuffer GetFile(FileTokenInfo fileToken, string cacheFolder, long from, long to, Action progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0) { return GetByteBuffer(fileToken, from, to, progress); } /// /// 获取文件(异步) /// /// /// 文件标识 /// Range开始位置 /// Range结束位置 /// /// public async Task GetFileAsync(FileTokenInfo fileTokenInfo, long from, long to, Action progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0) { return await Task.Run(() => { return GetByteBuffer(fileTokenInfo, from, to, progress); }); } /// /// 获取文件ByteBuffer /// /// /// /// /// /// private ByteBuffer GetByteBuffer(FileTokenInfo fileTokenInfo, long from, long to, Action progress) { if (string.IsNullOrWhiteSpace(fileTokenInfo.Url)) { Logger.WriteLineError("File token url can't be null"); return null; } if (from < 0) { Logger.WriteLineError("parameter error 'from'< 0"); return null; } if (to < 0) { Logger.WriteLineError("parameter error 'to'< 0"); return null; } var fileUrl = fileTokenInfo.Url; var fileData = ObjectStorageSingle.Instance.GetFile(fileUrl, from, to, progress); return new ByteBuffer(fileData); } /// /// 获取文件ByteBuffer /// /// /// /// private ByteBuffer GetByteBuffer(FileTokenInfo fileToken, Action progress) { if (fileToken == null) { Logger.WriteLineError("File token can't be null"); return null; } var fileUrl = fileToken.Url; var fileData = ObjectStorageSingle.Instance.GetFile(fileUrl, progress); return new ByteBuffer(fileData); } #endregion /// /// 批量下载文件 /// /// TCPCreator,UFile时不用传 /// 文件Token列表 /// 进度回调 /// 取消标识,UFile时不可取消 /// 文件内容列表 public IEnumerable GetFiles(IList fileTokenInfos, CancellationTokenSource cancelTokenSource = null, ClientLeaf storageLeaf = null) { //TODO reafactor in the future, ufile not supply a multi-download api but a tool var bytes = new List(); foreach (var fileToken in fileTokenInfos) { var fileUrl = fileToken.Url; var eachBytes = ObjectStorageSingle.Instance.GetFile(fileUrl); bytes.Add(eachBytes); } return bytes; } /// /// get file by file token /// /// /// Use the cached folder when the file is too large 4M /// /// /// /// public IBuffer GetFile(FileTokenInfo fileTokenInfo, string cacheFolder, Action progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0) { return GetByteBuffer(fileTokenInfo, progress); } /// /// down load files /// /// /// /// public bool DownloadFiles(string tempFolder, List fileList, Action progressCallback) { return ObjectStorageSingle.Instance.DownloadFiles(fileList,progressCallback); } } }