/// <summary> /// 文件流异步上传,返回文件guid /// </summary> /// <param name="request"></param> /// <returns></returns> public object Post(AsyncsFileUploadRequest request) { int code = (int)FS_ErrorCode.Request_Success; if (base.Request.Files.Length == 0) { LogUtil.Info(" request.file is null"); code = (int)FS_ErrorCode.RequestFile_Null; return new AsyncsFileUploadResponse { ret = code, message = ErrorCodeDic.GetInstance().CodeMessage(code), File_guid = string.Empty }; } AsyncsFileUploadResponse response = new AsyncsFileUploadResponse(); try { ICommonFilesService fileService = new CommonFilesService(); string fileName = (string.IsNullOrEmpty(request.file_name)) ? base.Request.Files[0].FileName : request.file_name; byte[] bytes = streamToBytes(base.Request.Files[0].InputStream); code = RequestValid(request, bytes); if (code != (int)FS_ErrorCode.Request_Success) return new AsyncsFileUploadResponse { ret = code, message = ErrorCodeDic.GetInstance().CodeMessage(code), File_guid = string.Empty }; response = fileService.AsynFileUpload(fileName, bytes); } catch (Exception e) { string err = string.Format("CommonFileServiceHost.AsyncsFileUploadRequest error = {0}, request = {1}", e.ToString(), JsonUtil<AsyncsFileUploadRequest>.ToJson(request)); LogUtil.Error(err); } return response; }
public AsyncsFileUploadResponse AsynAmrFileUpload(string fileName, string fileGuid, byte[] bytes) { if (!RequestValid(fileName, bytes)) return new AsyncsFileUploadResponse { ret = errorCode, message = ErrorCodeDic.GetInstance().CodeMessage(errorCode), File_guid = string.Empty }; AsyncsFileUploadResponse response = new AsyncsFileUploadResponse(); try { string filePath = string.Empty; string fileExtName = (fileName.Split('.').Length == 1) ? "" : fileName.Split('.')[1]; //string fileGuid = GetShortGuid(); int file_size = bytes.Length; // 计算MD5值, 若相同则不传物理文件至FDFS,只保存一条文件记录 String fileMD5 = FileOperationHelper.CalculateChunkMD5(bytes); FileEntity fileEntity = fileDA_R.GetFileEntityByMD5(fileMD5); if (fileEntity != null && fileEntity.file_md5.Equals(fileMD5)) // 文件已存在 { FileEntity newEntity = new FileEntity { file_guid = fileGuid, file_full_name = fileName, file_path = fileEntity.file_path, file_md5 = fileMD5, file_size = file_size, create_time = StringUtil.GetDateTimeSeconds(DateTime.Now), last_changed_time = StringUtil.GetDateTimeSeconds(DateTime.Now) }; long n = fileDA_W.CreateNewFile(newEntity); LogUtil.Info(string.Format("CommonFilesService.AsynAmrFileUpload exits file fileEntity: {0} create result:{1} ",JsonUtil<FileEntity>.ToJson(fileEntity), n)); } else { LogUtil.Info(string.Format("CommonFilesService.AsynAmrFileUpload begin upload: {0} fileguid = {1}, bytes Length={2}", fileName, fileGuid, bytes.Length)); // 异步上传新文件 Stopwatch watch = new Stopwatch(); watch.Start(); FSManager.BeginUploadFile(bytes, fileName, fileExtName, file_size, (uploadResult, uploadEx) => { if (null != uploadEx) { LogUtil.Error(string.Format("Error in FSManager.BeginUploadFile callback: {0}", uploadEx.ToString())); return; } if (null == uploadResult || string.IsNullOrEmpty(uploadResult.FilePathOnFDFS)) { LogUtil.Error(string.Format("Error in FSManager.BeginUploadFile callback:fdfs file Pash is null. FileName={0},fileSize={1}", fileName, bytes.Length)); return; } watch.Stop(); string info = string.Format("Async upload at server(ProcessId = {0}, ThreadId = {1}, CurrTheadsNum = {2}): file_guid = {3}, file_full_name = {4}, file_path = {5}," + " file_md5 = {6}, file_size = {7}, invoking time = {8}ms", Process.GetCurrentProcess().Id, Thread.CurrentThread.ManagedThreadId, Process.GetCurrentProcess().Threads.Count, fileGuid, fileName, uploadResult.FilePathOnFDFS, fileMD5, bytes.Length, watch.ElapsedMilliseconds); if (watch.ElapsedMilliseconds > 3000) { LogUtil.Error(info); errorCode = (int)FS_ErrorCode.RequestFile_TimeOut; } else LogUtil.Info(info); // 保存FileGuid ,filePath 和FileName, FileSize到数据库 watch.Start(); FileEntity entity = new FileEntity { file_guid = fileGuid, file_full_name = fileName, file_path = uploadResult.FilePathOnFDFS, file_md5 = fileMD5, file_size = file_size, create_time = StringUtil.GetDateTimeSeconds(DateTime.Now), last_changed_time = StringUtil.GetDateTimeSeconds(DateTime.Now) }; fileDA_W.CreateNewFile(entity); watch.Stop(); info = string.Format("after async upload: Save to mysql db cost {0}ms. file_guid={1}, file_full_name={2}", watch.ElapsedMilliseconds, entity.file_guid, entity.file_full_name); if (watch.ElapsedMilliseconds > 3000) { LogUtil.Error(info); errorCode = (int)FS_ErrorCode.RequestFile_TimeOut; } else LogUtil.Info(info); }); } response.ret = errorCode; response.message = ErrorCodeDic.GetInstance().CodeMessage(errorCode); response.File_guid = fileGuid; } catch (Exception ex) { LogUtil.Error(string.Format("Exception FSService.Post(): {0}", ex.ToString())); errorCode = (int)FS_ErrorCode.RequestFile_UploadErr; response.ret = errorCode; response.message = ErrorCodeDic.GetInstance().CodeMessage(errorCode); response.File_guid = string.Empty; } return response; }