123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- 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
- {
- /// <summary>
- /// 获取文件
- /// </summary>
- /// <param name="creator"></param>
- /// <param name="fileToken">文件标识</param>
- /// <param name="filePath">文件下载路径</param>
- /// <param name="progress"></param>
- /// <param name="cancelTokenSource"></param>
- public void GetFile(FileTokenInfo fileTokenInfo, string filePath, Action<double> 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);
- }
- /// <summary>
- /// 获取文件异步
- /// </summary>
- /// <param name="creator"></param>
- /// <param name="fileToken">文件标识</param>
- /// <param name="progress"></param>
- /// <param name="cancelTokenSource"></param>
- /// <param name="timeout"></param>
- /// <returns></returns>
- public async Task<IBuffer> GetFileAsync(FileTokenInfo fileToken, string cacheFilePath, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
- {
- return await Task.Run(() =>
- {
- return GetByteBuffer(fileToken, progress);
- });
- }
- /// <summary>
- /// 获取文件异步
- /// </summary>
- /// <param name="creator"></param>
- /// <param name="fileToken">文件标识</param>
- /// <param name="filePath">文件下载路径</param>
- /// <param name="progress"></param>
- /// <param name="cancelTokenSource"></param>
- /// <returns></returns>
- public async Task GetFileAsync(FileTokenInfo tokenInfo, string filePath, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null)
- {
- await Task.Run(() =>
- {
- GetFile(tokenInfo, filePath, progress, cancelTokenSource,true);
- });
- }
-
- #region 私有方法
- /// <summary>
- /// 获取UFile上保存的文件名称
- /// </summary>
- /// <param name="fileMd5"></param>
- /// <returns></returns>
- private string GetUFileStorageName(string fileMd5)
- {
- return $"{DateTime.UtcNow.ToString("yyyyMMdd")}_{DateTime.UtcNow.ToString("HH")}_{fileMd5}.dat";
- }
- /// <summary>
- /// 根据病例Id从数据库中获取文件信息
- /// </summary>
- /// <param name="fileToken"></param>
- /// <returns></returns>
- 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();
- }
- /// <summary>
- /// 从数据库中获取文件信息
- /// </summary>
- /// <param name="fileToken"></param>
- /// <returns></returns>
- 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();
- }
- /// <summary>
- /// 从批量从数据库中获取文件信息
- /// </summary>
- /// <param name="fileTokens">文件Token列表</param>
- /// <returns></returns>
- private GetObjectStorageFileInfoListResult GetObjectStorageFileInfoList(List<string> 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();
- }
- /// <summary>
- /// 保存文件到数据库
- /// </summary>
- /// <param name="fileMd5"></param>
- /// <param name="fileSize"></param>
- /// <returns></returns>
- 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();
- }
- /// <summary>
- /// 获取文件
- /// </summary>
- /// <param name="creator"></param>
- /// <param name="fileToken">文件标识</param>
- /// <param name="from">Range开始位置</param>
- /// <param name="to">Range结束位置</param>
- /// <param name="progress"></param>
- /// <param name="cancelTokenSource"></param>
- public IBuffer GetFile(FileTokenInfo fileToken, string cacheFolder, long from, long to, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
- {
- return GetByteBuffer(fileToken, from, to, progress);
- }
- /// <summary>
- /// 获取文件(异步)
- /// </summary>
- /// <param name="creator"></param>
- /// <param name="fileToken">文件标识</param>
- /// <param name="from">Range开始位置</param>
- /// <param name="to">Range结束位置</param>
- /// <param name="progress"></param>
- /// <param name="cancelTokenSource"></param>
- public async Task<IBuffer> GetFileAsync(FileTokenInfo fileTokenInfo, long from, long to, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
- {
- return await Task.Run(() =>
- {
- return GetByteBuffer(fileTokenInfo, from, to, progress);
- });
- }
- /// <summary>
- /// 获取文件ByteBuffer
- /// </summary>
- /// <param name="fileToken"></param>
- /// <param name="from"></param>
- /// <param name="to"></param>
- /// <param name="progress"></param>
- /// <returns></returns>
- private ByteBuffer GetByteBuffer(FileTokenInfo fileTokenInfo, long from, long to, Action<double> 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);
- }
- /// <summary>
- /// 获取文件ByteBuffer
- /// </summary>
- /// <param name="fileToken"></param>
- /// <param name="progress"></param>
- /// <returns></returns>
- private ByteBuffer GetByteBuffer(FileTokenInfo fileToken, Action<double> 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
- /// <summary>
- /// 批量下载文件
- /// </summary>
- /// <param name="creator">TCPCreator,UFile时不用传</param>
- /// <param name="fileTokens">文件Token列表</param>
- /// <param name="progress">进度回调</param>
- /// <param name="cancelTokenSource">取消标识,UFile时不可取消</param>
- /// <returns>文件内容列表</returns>
- public IEnumerable<byte[]> GetFiles(IList<FileTokenInfo> 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<byte[]>();
- foreach (var fileToken in fileTokenInfos)
- {
- var fileUrl = fileToken.Url;
- var eachBytes = ObjectStorageSingle.Instance.GetFile(fileUrl);
- bytes.Add(eachBytes);
- }
- return bytes;
- }
-
- /// <summary>
- /// get file by file token
- /// </summary>
- /// <param name="fileTokenInfo"></param>
- /// <param name="cacheFolder">Use the cached folder when the file is too large 4M</param>
- /// <param name="progress"></param>
- /// <param name="cancelTokenSource"></param>
- /// <param name="timeout"></param>
- /// <returns></returns>
- public IBuffer GetFile(FileTokenInfo fileTokenInfo, string cacheFolder, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
- {
- return GetByteBuffer(fileTokenInfo, progress);
- }
- /// <summary>
- /// down load files
- /// </summary>
- /// <param name="tempFolder"></param>
- /// <param name="fileList"></param>
- /// <returns></returns>
- public bool DownloadFiles(string tempFolder, List<ObjectFileInfo> fileList, Action<double> progressCallback)
- {
- return ObjectStorageSingle.Instance.DownloadFiles(fileList,progressCallback);
- }
- }
- }
|