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