Пример #1
0
        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);
        }