public MessageEntity RequestUploadFile([FromBody] RequestFileUploadEntity requestFile)
        {
            //LogUtil.Debug($"RequestUploadFile 接收参数:{JsonConvert.SerializeObject(requestFile)}");
            MessageEntity message = new MessageEntity();

            if (requestFile.size <= 0 || requestFile.count <= 0 || string.IsNullOrEmpty(requestFile.filedata))
            {
                message.Code = -1;
                message.Msg  = "参数有误";
            }
            else
            {
                //这里需要记录文件相关信息,并返回文件guid名,后续请求带上此参数
                string guidName = Guid.NewGuid().ToString("N");
                //前期单台服务器可以记录Cache,多台后需考虑redis或数据库
                _cache.Set(guidName, requestFile);
                message.Code = 0;
                message.Msg  = "";
                message.Data = new { filename = guidName };
            }
            return(message);
        }
        public MessageEntity RequestDownloadFile([FromBody] Dictionary <string, object> fileInfo)
        {
            MessageEntity message  = new MessageEntity();
            string        fileName = string.Empty;
            string        fileExt  = string.Empty;

            if (fileInfo.ContainsKey("name"))
            {
                fileName = fileInfo["name"].ToString();
            }
            if (fileInfo.ContainsKey("ext"))
            {
                fileExt = fileInfo["ext"].ToString();
            }
            if (string.IsNullOrEmpty(fileName))
            {
                message.Code = -1;
                message.Msg  = "文件名不能为空";
                return(message);
            }
            //获取对应目录下文件,如果有,获取文件开始准备分段下载
            string filePath = $".{Appsettings.app(new string[] { "TestFileHandle", "FilePath" })}{DateTime.Now.ToString("yyyy-MM-dd")}/{fileName}";

            filePath = $"{filePath}{fileExt}";
            FileStream fs = null;

            try
            {
                if (!System.IO.File.Exists(filePath))
                {
                    //文件为空
                    message.Code = -1;
                    message.Msg  = "文件尚未处理完";
                    return(message);
                }
                fs = new FileStream(filePath, FileMode.Open);
                if (fs.Length <= 0)
                {
                    //文件为空
                    message.Code = -1;
                    message.Msg  = "文件尚未处理完";
                    return(message);
                }
                int shardSize = 1 * 1024 * 1024;//一次1M
                RequestFileUploadEntity request = new RequestFileUploadEntity();
                request.fileext = fileExt;
                request.size    = fs.Length;
                request.count   = (int)(fs.Length / shardSize);
                if ((fs.Length % shardSize) > 0)
                {
                    request.count += 1;
                }
                request.filedata = GetCryptoString(fs);

                message.Data = request;
            }
            catch (Exception ex)
            {
                //LogUtil.Debug($"读取文件信息失败:{filePath},错误信息:{ex.Message}");
            }
            finally
            {
                if (fs != null)
                {
                    fs.Close();
                }
            }

            return(message);
        }
        public async Task <MessageEntity> FileMerge([FromBody] Dictionary <string, object> fileInfo)
        {
            MessageEntity message  = new MessageEntity();
            string        fileName = string.Empty;

            if (fileInfo.ContainsKey("name"))
            {
                fileName = fileInfo["name"].ToString();
            }
            if (string.IsNullOrEmpty(fileName))
            {
                message.Code = -1;
                message.Msg  = "文件名不能为空";
                return(message);
            }

            //最终上传完成后,请求合并返回合并消息
            try
            {
                RequestFileUploadEntity requestFile = _cache.Get(fileName) as RequestFileUploadEntity;
                if (requestFile == null)
                {
                    message.Code = -1;
                    message.Msg  = "合并失败";
                    return(message);
                }
                string filePath     = $".{Appsettings.app(new string[] { "TestFileHandle", "FilePath" })}{DateTime.Now.ToString("yyyy-MM-dd")}/{fileName}";
                string fileExt      = requestFile.fileext;
                string fileMd5      = requestFile.filedata;
                int    fileCount    = requestFile.count;
                long   fileSize     = requestFile.size;
                string fileTestname = requestFile.filename;

                //LogUtil.Debug($"获取文件路径:{filePath}");
                //LogUtil.Debug($"获取文件类型:{fileExt}");

                string savePath      = filePath.Replace(fileName, "");
                string saveFileName  = $"{fileTestname}";
                var    files         = Directory.GetFiles(filePath);
                string fileFinalName = Path.Combine(savePath, saveFileName);
                //LogUtil.Debug($"获取文件最终路径:{fileFinalName}");
                FileStream fs = new FileStream(fileFinalName, FileMode.Create);
                //LogUtil.Debug($"目录文件下文件总数:{files.Length}");

                //LogUtil.Debug($"目录文件排序前:{string.Join(",", files.ToArray())}");
                //LogUtil.Debug($"目录文件排序后:{string.Join(",", files.OrderBy(x => x.Length).ThenBy(x => x))}");
                byte[] finalBytes = new byte[fileSize];
                foreach (var part in files.OrderBy(x => x.Length).ThenBy(x => x))
                {
                    var bytes = System.IO.File.ReadAllBytes(part);

                    await fs.WriteAsync(bytes, 0, bytes.Length);

                    bytes = null;
                    System.IO.File.Delete(part);//删除分块
                }
                fs.Close();
                //这个地方会引发文件被占用异常
                fs = new FileStream(fileFinalName, FileMode.Open);
                string strMd5 = GetCryptoString(fs);
                //LogUtil.Debug($"文件数据MD5:{strMd5}");
                //LogUtil.Debug($"文件上传数据:{JsonConvert.SerializeObject(requestFile)}");
                fs.Close();
                Directory.Delete(filePath);
                //如果MD5与原MD5不匹配,提示重新上传
                if (strMd5 != requestFile.filedata)
                {
                    //LogUtil.Debug($"上传文件md5:{requestFile.filedata},服务器保存文件md5:{strMd5}");
                    message.Code = -1;
                    message.Msg  = "MD5值不匹配";
                    return(message);
                }

                _cache.Remove(fileInfo["name"].ToString());
                message.Code = 0;
                message.Msg  = "";
            }
            catch (Exception ex)
            {
                //LogUtil.Error($"合并文件失败,文件名称:{fileName},错误信息:{ex.Message}");
                message.Code = -1;
                message.Msg  = "合并文件失败,请重新上传";
            }
            return(message);
        }