/// <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); } }