Exemplo n.º 1
0
        public static File CreateDirectoryRecord(string name, string folder, string path, User user)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new FileNameIsEmptyException();
            }

            var ret = new File()
            {
                // Name: 文件夹名
                Name = name,
                // Type: "text/directory"
                Type = "text/directory",
                // Folder: 上层目录名
                Folder = folder,
                // Path: 该文件夹的路径: Folder + Name
                Path = path,
                // Guid: [空]
                Guid = null,
                // StorageName: [空]
                StorageName = "",
                // User: 创建的用户
                User = user,
                // Status: 已确认
                Status = FileStatus.Confirmed,
                // Size: [空]
                Size = 0,
                // Md5: [空]
                Md5 = null
            };
            ret.GetPermission();
            return ret;
        }
        private IActionResult RequestUploadFile(FileUploadRequestModel requestModel, User loginUser)
        {
            var ofile = _databaseService.Files.
                        FirstOrDefault(s =>
                                       s.Md5 == requestModel.Md5.ToLower() &&                // 哈希相等
                                       s.Size == requestModel.Size &&                        // 文件大小相等
                                       s.Status == Models.Entities.File.FileStatus.Confirmed // 文件已上传完
                                       );

            var file = new EntityFile();

            if (ofile != null)
            {
                file.Path   = requestModel.Path;
                file.Type   = requestModel.Type;
                file.Folder = Path.GetDirectoryName(requestModel.Path) ?? "";
                file.Name   = Path.GetFileName(requestModel.Path) ?? "";

                file.Guid        = ofile.Guid;
                file.StorageName = ofile.StorageName;
                file.User        = loginUser;
                file.Status      = Models.Entities.File.FileStatus.Confirmed;
                file.Size        = ofile.Size;
                file.Md5         = ofile.Md5.ToLower();
            }
            else
            {
                file.Path   = requestModel.Path;
                file.Type   = requestModel.Type;
                file.Folder = Path.GetDirectoryName(requestModel.Path) ?? "";
                file.Name   = Path.GetFileName(requestModel.Path) ?? "";
                if (string.IsNullOrEmpty(file.Name))
                {
                    throw new FileNameIsEmptyException("The file name is empty.");
                }

                file.Guid = Guid.NewGuid().ToString().ToLower();
                // TODO 检查 Guid 是否有重复

                file.StorageName = $"{file.Guid[0]}{file.Guid[1]}/{file.Guid[2]}{file.Guid[3]}/{file.Guid}{Path.GetExtension(requestModel.Path)}";
                file.StorageName = Path.Join(_tencentCosManagement.Prefix, file.StorageName).Replace("\\", "/");

                file.User   = loginUser;
                file.Status = Models.Entities.File.FileStatus.Pending;
                file.Size   = requestModel.Size;
                file.Md5    = requestModel.Md5.ToLower();
            }

            // file.Path = file.Folder.Replace("\\", "/");
            file.Folder = file.Folder.Replace("\\", "/");
            file.GetPermission();
            _databaseService.Files.Add(file);


            Dictionary <string, object> token;

            if (file.Status == Models.Entities.File.FileStatus.Pending)
            {
                try
                {
                    token = _tencentCos.GetUploadToken(file);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, e.Message, e.Data);
                    throw new UnexpectedException(e.Message);
                }

                SetApiResultStatus(ApiResultStatus.StorageUploadContinue);
            }
            else
            {
                token = null;

                SetApiResultStatus(ApiResultStatus.StorageUploadSkip);
            }

            _databaseService.SaveChanges();

            return(Ok(new FileUploadRequestResultModel(file, token, _tencentCosManagement)));
        }