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);
}
}
}