/// <summary> /// 合并上传的分块 /// </summary> /// <param name="uri"></param> /// <param name="filePath"></param> /// <returns></returns> private async Task <bool> Merge(string filePath, string dir) { using (HttpClient httpClient = new HttpClient() { Timeout = TimeSpan.FromSeconds(10) }) { try { string fileName = Path.GetFileName(filePath); if (!string.IsNullOrEmpty(dir)) { fileName = Path.Combine(dir, Path.GetFileName(filePath)).Replace(Path.DirectorySeparatorChar, '/'); } var result = await httpClient.GetAsync(this.mergeURL + "?fileName=" + fileName); if (result.IsSuccessStatusCode) { JsonRespondResult respondResult = JsonConvert.DeserializeObject <JsonRespondResult>(await result.Content.ReadAsStringAsync()); if (!respondResult.Result) { this.OnUploadError(new ErrorArgs(respondResult.Message)); } return(respondResult.Result); } } catch (Exception ex) { this.OnUploadError(new ErrorArgs(ex.Message)); } } return(false); }
/// <summary> 删除版本 /// </summary> /// <param name="version">版本号</param> public async Task <bool> DeleteVersion(string version) { using (HttpClient httpClient = new HttpClient()) { try { HttpResponseMessage httpResponseMessage = await httpClient.DeleteAsync(this.url + "/deleteVersion?version=" + version); if (httpResponseMessage.IsSuccessStatusCode) { JsonRespondResult respondResult = JsonConvert.DeserializeObject <JsonRespondResult>(await httpResponseMessage.Content.ReadAsStringAsync()); if (!respondResult.Result) { this.OnUpgradeError(new ErrorArgs(respondResult.Message)); } return(respondResult.Result); } } catch (Exception ex) { this.OnUpgradeError(new ErrorArgs(ex.Message)); return(true); } } return(false); }
/// <summary> /// 获取文件版本号 /// </summary> /// <param name="fileName"></param> /// <returns></returns> public async Task <string> GetVersion(string fileName) { using (HttpClient httpClient = new HttpClient()) { try { HttpResponseMessage httpResponseMessage = await httpClient.GetAsync(this.url + "/getFileVersion?fileName=" + fileName); if (httpResponseMessage.IsSuccessStatusCode) { JsonRespondResult respondResult = JsonConvert.DeserializeObject <JsonRespondResult>(await httpResponseMessage.Content.ReadAsStringAsync()); if (respondResult.Result) { return(respondResult.Message); } else { return(null); } } } catch (Exception ex) { this.OnUpgradeError(new ErrorArgs(ex.Message)); } } return(null); }
/// <summary> 新增版本 /// </summary> /// <param name="version">版本号</param> public async Task <bool> CreateVersion(JsonReleaseVersion jsonReleaseVersion) { using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false })) //若想手动设置Cookie则必须设置UseCookies = false { StringContent stringContent = new StringContent(JsonConvert.SerializeObject(jsonReleaseVersion)); stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); try { var result = await client.PostAsync(new Uri(this.url + "/createVersion"), stringContent); if (result.IsSuccessStatusCode) { JsonRespondResult respondResult = JsonConvert.DeserializeObject <JsonRespondResult>(await result.Content.ReadAsStringAsync()); if (!respondResult.Result) { this.OnUpgradeError(new ErrorArgs(respondResult.Message)); } return(respondResult.Result); } } catch (Exception ex) { this.OnUpgradeError(new ErrorArgs(ex.Message)); return(false); } } return(true); }
/// <summary> 异步获取下载流 /// </summary> /// <param name="fileName"></param> /// <returns></returns> public Task <JsonRespondResult> Upload(HttpRequest httpRequest, string uploadDir = null) { return(Task <JsonRespondResult> .Run(() => { try { List <JsonRespondResult> error = new List <JsonRespondResult>(); foreach (var formFile in httpRequest.Form.Files) { JsonRespondResult respondResult = null; if (formFile.Name == "file") { respondResult = this.UploadOnce(formFile, uploadDir); } else { respondResult = this.UploadChunk(formFile, uploadDir); } if (!respondResult.Result) { error.Add(respondResult); } } if (error.Count == 0) { return new JsonRespondResult() { Message = "上传成功" }; } else { return new JsonRespondResult() { Result = false, Message = "上传失败", Details = error.Select(e => e.Message).ToArray() }; } } catch (Exception ex) { return new JsonRespondResult() { Result = false, Message = "上传失败" + ex.Message }; } })); }
/// <summary> /// 上传分块 /// </summary> /// <param name="uri"></param> /// <param name="stream"></param> /// <param name="filePath"></param> /// <param name="chunkName"></param> /// <param name="tryCount"></param> /// <returns></returns> private async Task <bool> UploadChunk(Stream stream, string filePath, string chunkName, long uploaded, long totalLength, string dir, int tryCount = 0) { bool success = false; long loaded = 0; using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false }) { Timeout = TimeSpan.FromSeconds(10) }) //若想手动设置Cookie则必须设置UseCookies = false { MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent(); multipartFormDataContent.Add(new ProgressableStreamContent( stream, UploadBufferSize, (r, u) => { loaded = uploaded + u; this.OnUploadProgressChanged(new ProgressChangedArgs(r, uploaded + u, totalLength)); }, (s) => this.OnUploadSpeedChanged(new SpeedChangedArgs(s))), chunkName, Path.GetFileName(filePath)); try { var result = await client.PostAsync(new Uri(this.uploadUrl + "?uploadDir=" + dir), multipartFormDataContent); if (result.IsSuccessStatusCode) { JsonRespondResult respondResult = JsonConvert.DeserializeObject <JsonRespondResult>(await result.Content.ReadAsStringAsync()); success = respondResult.Result; if (!respondResult.Result) { this.OnUploadError(new ErrorArgs(respondResult.Message)); } } } catch (Exception ex) { this.OnUploadError(new ErrorArgs(ex.Message)); } } if (!success && tryCount < 3) { this.OnUploadProgressChanged(new ProgressChangedArgs((int)(uploaded - loaded), uploaded, totalLength)); success |= await UploadChunk(stream, filePath, chunkName, uploaded, totalLength, dir, tryCount + 1); } return(success); }
/// <summary> /// 一次性上传 /// </summary> /// <param name="uri"></param> /// <param name="filePath"></param> /// <returns></returns> private async Task <bool> UploadOnce(string filePath, string dir) { using (FileStream fileStream = System.IO.File.OpenRead(filePath)) using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false }) { Timeout = TimeSpan.FromSeconds(10) }) //若想手动设置Cookie则必须设置UseCookies = false { MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent(); multipartFormDataContent.Add(new ProgressableStreamContent( fileStream, UploadBufferSize, (r, u) => this.OnUploadProgressChanged(new ProgressChangedArgs(r, u, fileStream.Length)), (s) => this.OnUploadSpeedChanged(new SpeedChangedArgs(s))), "file", Path.GetFileName(filePath)); try { var result = await client.PostAsync(new Uri(this.uploadUrl + "?uploadDir=" + dir), multipartFormDataContent); if (result.IsSuccessStatusCode) { JsonRespondResult respondResult = JsonConvert.DeserializeObject <JsonRespondResult>(await result.Content.ReadAsStringAsync()); if (!respondResult.Result) { this.OnUploadError(new ErrorArgs(respondResult.Message)); } return(respondResult.Result); } } catch (Exception ex) { this.OnUploadError(new ErrorArgs(ex.Message)); } } return(false); }