/// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="ownerType">文件所有者类型</param>
        /// <param name="ownerId">文件所有者ID</param>
        /// <param name="file">文件路径</param>
        /// <param name="fileName">文件名</param>
        /// <param name="hash">小写hex sha1值。如果为空并且file.CanSeek则自动计算sha1值</param>
        /// <param name="periodMinute">链接有效期(分钟),0则不过期</param>
        public async Task <DataResult <UploadResultData> > UploadAsync(int ownerType, int ownerId, Stream file, string fileName, string hash = null, int periodMinute = 0)
        {
            using (var httpClient = _httpClientFac.CreateClient())
            {
                if (string.IsNullOrEmpty(hash) && file.CanSeek)
                {
                    hash = HashUtil.Sha1(file);
                    file.Seek(0, SeekOrigin.Begin);
                }

                var url = _fsApiHost + "/sapi/files";
                DataResult <UploadResultData> result = null;
                if (!string.IsNullOrEmpty(hash))
                {
                    var mfdc = new MultipartFormDataContent();
                    mfdc.AddByString("ownerType", ownerType.ToString());
                    mfdc.AddByString("ownerId", ownerId.ToString());
                    mfdc.AddByString("fileName", fileName);
                    mfdc.AddByString("hash", hash);
                    mfdc.AddByString("periodMinute", periodMinute.ToString());

                    result = await httpClient.GetResultAsync <DataResult <UploadResultData> >(HttpMethod.Post, url, mfdc);
                }

                if (result == null || result.ErrorCode == 100)
                {
                    var mfdc = new MultipartFormDataContent();
                    mfdc.AddByString("ownerType", ownerType.ToString());
                    mfdc.AddByString("ownerId", ownerId.ToString());
                    mfdc.AddByString("fileName", fileName);
                    mfdc.AddByString("periodMinute", periodMinute.ToString());

                    //StreamContent会自动释放Stream
                    var sc = new StreamContent(file);
                    sc.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                    mfdc.Add(sc, "file", fileName);
                    result = await httpClient.GetResultAsync <DataResult <UploadResultData> >(HttpMethod.Post, url, mfdc);
                }

                return(result);
            }
        }