ObjectStorageDownloader.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Vinno.IUS.Common.IO;
  6. using Vinno.IUS.Common.Log;
  7. using Vinno.IUS.Common.Network.Leaf;
  8. using Vinno.vCloud.Common.Storage.ObjectStorageInfo;
  9. using Vinno.vCloud.Protocol.Messages.Client.Storage;
  10. namespace Vinno.vCloud.Common.Storage.Download
  11. {
  12. public class ObjectStorageDownloader : IDownloader
  13. {
  14. /// <summary>
  15. /// 获取文件
  16. /// </summary>
  17. /// <param name="creator"></param>
  18. /// <param name="fileToken">文件标识</param>
  19. /// <param name="filePath">文件下载路径</param>
  20. /// <param name="progress"></param>
  21. /// <param name="cancelTokenSource"></param>
  22. public void GetFile(FileTokenInfo fileTokenInfo, string filePath, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null,bool isUseCDNNode = true)
  23. {
  24. var fileUrl = fileTokenInfo.Url;
  25. if (!isUseCDNNode)
  26. {
  27. fileUrl = NodeMapping.DoDefaultMapping(fileUrl);
  28. }
  29. else
  30. {
  31. fileUrl = NodeMapping.DoCDNMapping(fileUrl);
  32. }
  33. ObjectStorageSingle.Instance.DownloadFile(filePath, fileUrl, progress,cancelTokenSource);
  34. }
  35. /// <summary>
  36. /// 获取文件异步
  37. /// </summary>
  38. /// <param name="creator"></param>
  39. /// <param name="fileToken">文件标识</param>
  40. /// <param name="progress"></param>
  41. /// <param name="cancelTokenSource"></param>
  42. /// <param name="timeout"></param>
  43. /// <returns></returns>
  44. public async Task<IBuffer> GetFileAsync(FileTokenInfo fileToken, string cacheFilePath, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
  45. {
  46. return await Task.Run(() =>
  47. {
  48. return GetByteBuffer(fileToken, progress);
  49. });
  50. }
  51. /// <summary>
  52. /// 获取文件异步
  53. /// </summary>
  54. /// <param name="creator"></param>
  55. /// <param name="fileToken">文件标识</param>
  56. /// <param name="filePath">文件下载路径</param>
  57. /// <param name="progress"></param>
  58. /// <param name="cancelTokenSource"></param>
  59. /// <returns></returns>
  60. public async Task GetFileAsync(FileTokenInfo tokenInfo, string filePath, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null)
  61. {
  62. await Task.Run(() =>
  63. {
  64. GetFile(tokenInfo, filePath, progress, cancelTokenSource,true);
  65. });
  66. }
  67. #region 私有方法
  68. /// <summary>
  69. /// 获取UFile上保存的文件名称
  70. /// </summary>
  71. /// <param name="fileMd5"></param>
  72. /// <returns></returns>
  73. private string GetUFileStorageName(string fileMd5)
  74. {
  75. return $"{DateTime.UtcNow.ToString("yyyyMMdd")}_{DateTime.UtcNow.ToString("HH")}_{fileMd5}.dat";
  76. }
  77. /// <summary>
  78. /// 根据病例Id从数据库中获取文件信息
  79. /// </summary>
  80. /// <param name="fileToken"></param>
  81. /// <returns></returns>
  82. private GetObjectStorageFileInfoByExamDataIdResult GetObjectStorageFileInfoByExamDataId(string examDataId)
  83. {
  84. //GetObjectStorageFileInfoByExamDataIdRequest request = new GetObjectStorageFileInfoByExamDataIdRequest();
  85. //request.ExamDataId = examDataId;
  86. //var message = _uFIleStorageHelper.LeafAgency?.AgencySend(request);
  87. //return GetObjectStorageFileInfoByExamDataIdResult.Convert(message);
  88. throw new NotImplementedException();
  89. }
  90. /// <summary>
  91. /// 从数据库中获取文件信息
  92. /// </summary>
  93. /// <param name="fileToken"></param>
  94. /// <returns></returns>
  95. private GetObjectStorageFileInfoResult GetObjectStorageFileInfo(string fileToken)
  96. {
  97. //GetObjectStorageFileInfoRequest request = new GetObjectStorageFileInfoRequest();
  98. //request.FileToken = fileToken;
  99. //request.StorageNode = DownloadStorageNode;
  100. //var message = _uFIleStorageHelper.LeafAgency?.AgencySend(request);
  101. //var result = GetObjectStorageFileInfoResult.Convert(message);
  102. //if (result != null && result.FileUrl.IndexOf("127.0.0.1:") > -1)
  103. //{
  104. // result.FileUrl = string.Empty;
  105. //}
  106. //return result;
  107. throw new NotImplementedException();
  108. }
  109. /// <summary>
  110. /// 从批量从数据库中获取文件信息
  111. /// </summary>
  112. /// <param name="fileTokens">文件Token列表</param>
  113. /// <returns></returns>
  114. private GetObjectStorageFileInfoListResult GetObjectStorageFileInfoList(List<string> fileTokens, ClientLeaf clientLeaf = null)
  115. {
  116. //GetObjectStorageFileInfoListRequest request = new GetObjectStorageFileInfoListRequest();
  117. //request.FileTokens = fileTokens;
  118. //request.StorageNode = DownloadStorageNode;
  119. //var message = clientLeaf != null ? clientLeaf.Send(request) : _uFIleStorageHelper.LeafAgency?.AgencySend(request);
  120. //if (message != null)
  121. //{
  122. // var result = GetObjectStorageFileInfoListResult.Convert(message);
  123. // if (result != null)
  124. // {
  125. // foreach (var fileInfo in result.ResultList)
  126. // {
  127. // if (fileInfo.FileUrl.IndexOf("127.0.0.1:") > -1)
  128. // {
  129. // fileInfo.FileUrl = string.Empty;
  130. // }
  131. // }
  132. // }
  133. // return result;
  134. //}
  135. //return null;
  136. throw new NotImplementedException();
  137. }
  138. /// <summary>
  139. /// 保存文件到数据库
  140. /// </summary>
  141. /// <param name="fileMd5"></param>
  142. /// <param name="fileSize"></param>
  143. /// <returns></returns>
  144. private SaveObjectStorageFileInfoResult SaveObjectStorageFileInfo(string fileName, string fileMd5, string fileUrl)
  145. {
  146. //SaveObjectStorageFileInfoRequest request = new SaveObjectStorageFileInfoRequest();
  147. //request.ClientUploadObjectStorageFileInfoMessage = new ClientUploadObjectStorageFileInfoMessage
  148. //{
  149. // FileUrl = fileUrl,
  150. // FileName = fileName,
  151. // FileMd5 = fileMd5,
  152. // Token = fileMd5
  153. //};
  154. //var message = _uFIleStorageHelper.LeafAgency?.AgencySend(request);
  155. //return SaveObjectStorageFileInfoResult.Convert(message);
  156. throw new NotImplementedException();
  157. }
  158. /// <summary>
  159. /// 获取文件
  160. /// </summary>
  161. /// <param name="creator"></param>
  162. /// <param name="fileToken">文件标识</param>
  163. /// <param name="from">Range开始位置</param>
  164. /// <param name="to">Range结束位置</param>
  165. /// <param name="progress"></param>
  166. /// <param name="cancelTokenSource"></param>
  167. public IBuffer GetFile(FileTokenInfo fileToken, string cacheFolder, long from, long to, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
  168. {
  169. return GetByteBuffer(fileToken, from, to, progress);
  170. }
  171. /// <summary>
  172. /// 获取文件(异步)
  173. /// </summary>
  174. /// <param name="creator"></param>
  175. /// <param name="fileToken">文件标识</param>
  176. /// <param name="from">Range开始位置</param>
  177. /// <param name="to">Range结束位置</param>
  178. /// <param name="progress"></param>
  179. /// <param name="cancelTokenSource"></param>
  180. public async Task<IBuffer> GetFileAsync(FileTokenInfo fileTokenInfo, long from, long to, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
  181. {
  182. return await Task.Run(() =>
  183. {
  184. return GetByteBuffer(fileTokenInfo, from, to, progress);
  185. });
  186. }
  187. /// <summary>
  188. /// 获取文件ByteBuffer
  189. /// </summary>
  190. /// <param name="fileToken"></param>
  191. /// <param name="from"></param>
  192. /// <param name="to"></param>
  193. /// <param name="progress"></param>
  194. /// <returns></returns>
  195. private ByteBuffer GetByteBuffer(FileTokenInfo fileTokenInfo, long from, long to, Action<double> progress)
  196. {
  197. if (string.IsNullOrWhiteSpace(fileTokenInfo.Url))
  198. {
  199. Logger.WriteLineError("File token url can't be null");
  200. return null;
  201. }
  202. if (from < 0)
  203. {
  204. Logger.WriteLineError("parameter error 'from'< 0");
  205. return null;
  206. }
  207. if (to < 0)
  208. {
  209. Logger.WriteLineError("parameter error 'to'< 0");
  210. return null;
  211. }
  212. var fileUrl = fileTokenInfo.Url;
  213. var fileData = ObjectStorageSingle.Instance.GetFile(fileUrl, from, to, progress);
  214. return new ByteBuffer(fileData);
  215. }
  216. /// <summary>
  217. /// 获取文件ByteBuffer
  218. /// </summary>
  219. /// <param name="fileToken"></param>
  220. /// <param name="progress"></param>
  221. /// <returns></returns>
  222. private ByteBuffer GetByteBuffer(FileTokenInfo fileToken, Action<double> progress)
  223. {
  224. if (fileToken == null)
  225. {
  226. Logger.WriteLineError("File token can't be null");
  227. return null;
  228. }
  229. var fileUrl = fileToken.Url;
  230. var fileData = ObjectStorageSingle.Instance.GetFile(fileUrl, progress);
  231. return new ByteBuffer(fileData);
  232. }
  233. #endregion
  234. /// <summary>
  235. /// 批量下载文件
  236. /// </summary>
  237. /// <param name="creator">TCPCreator,UFile时不用传</param>
  238. /// <param name="fileTokens">文件Token列表</param>
  239. /// <param name="progress">进度回调</param>
  240. /// <param name="cancelTokenSource">取消标识,UFile时不可取消</param>
  241. /// <returns>文件内容列表</returns>
  242. public IEnumerable<byte[]> GetFiles(IList<FileTokenInfo> fileTokenInfos, CancellationTokenSource cancelTokenSource = null, ClientLeaf storageLeaf = null)
  243. {
  244. //TODO reafactor in the future, ufile not supply a multi-download api but a tool
  245. var bytes = new List<byte[]>();
  246. foreach (var fileToken in fileTokenInfos)
  247. {
  248. var fileUrl = fileToken.Url;
  249. var eachBytes = ObjectStorageSingle.Instance.GetFile(fileUrl);
  250. bytes.Add(eachBytes);
  251. }
  252. return bytes;
  253. }
  254. /// <summary>
  255. /// get file by file token
  256. /// </summary>
  257. /// <param name="fileTokenInfo"></param>
  258. /// <param name="cacheFolder">Use the cached folder when the file is too large 4M</param>
  259. /// <param name="progress"></param>
  260. /// <param name="cancelTokenSource"></param>
  261. /// <param name="timeout"></param>
  262. /// <returns></returns>
  263. public IBuffer GetFile(FileTokenInfo fileTokenInfo, string cacheFolder, Action<double> progress = null, CancellationTokenSource cancelTokenSource = null, int timeout = 0)
  264. {
  265. return GetByteBuffer(fileTokenInfo, progress);
  266. }
  267. /// <summary>
  268. /// down load files
  269. /// </summary>
  270. /// <param name="tempFolder"></param>
  271. /// <param name="fileList"></param>
  272. /// <returns></returns>
  273. public bool DownloadFiles(string tempFolder, List<ObjectFileInfo> fileList, Action<double> progressCallback)
  274. {
  275. return ObjectStorageSingle.Instance.DownloadFiles(fileList,progressCallback);
  276. }
  277. }
  278. }