private async Task <FileNode> DoUpload(string ownerId, string path, string name, string md5, string overwritten, string tags = null) { FileData storageFileByMd5 = null; long size = 0; HttpPostedFileBase file = null; if (!string.IsNullOrEmpty(md5))//根据md5直接获取storage file { try { storageFileByMd5 = _storageClient.GetFileData(md5); size = storageFileByMd5.Size; } catch (Exception e) { throw new SysException(Infrastructure.ErrorCode.FileMd5NotFound); } } else //根据Request.File获取file { if (Request.Files.Count != 1) { throw new SysException(Infrastructure.ErrorCode.OnlyOneFileAllowed, "只能上传一个文件." + Request.Files.Count); } file = Request.Files[0]; size = file.ContentLength; } FileNode fileToOverwrite = (path == null ? null : _nodeAppService.GetNode <FileNode>(ownerId, path, name)); var isModify = fileToOverwrite != null && overwritten == Boolean.TrueString; //检查配额,及检查文件是否存在,放在这里做可以让Upload/Modify调storageClient.Upload的时序一致 long sizeToChange = size; if (isModify) { sizeToChange -= fileToOverwrite.Size; } else if (fileToOverwrite != null) { throw new Exception("文件已存在."); } _quotaAppService.CheckQuota(ownerId, sizeToChange); //storage上传 var storageFile = storageFileByMd5 ?? await _storageClient.UploadAsync(file.InputStream); //增加/更新文件节点 FileNode fileNode = null; if (isModify) { _storageClient.Remove(fileToOverwrite.StorageFileId); _quotaAppService.Decrease(ownerId, fileToOverwrite.Size, fileToOverwrite.Id); fileNode = _nodeAppService.ModifyFileNode(fileToOverwrite, size, storageFile.Id); } else { fileNode = _nodeAppService.CreateFileNode(ownerId, path, name, size, storageFile.Id, tags); } _quotaAppService.Increase(ownerId, size, fileNode.Id); FileNodeChanged(fileNode); return(fileNode); }