public JsonResult SaveBigFileToServer() { try { long start = Convert.ToInt64(Request.Form["Start"]); long end = Convert.ToInt64(Request.Form["End"]); var fileName = CommonHelper.DecodeUrl(Request.Form["FileName"]); _log.Debug($"SaveBigFileToServer Save Blob {start} Of {end}, FileName: {fileName}"); var fileBlob = Request.Files[0]; var fileLength = fileBlob.ContentLength; byte[] fileBytes = new byte[fileLength]; fileBlob.InputStream.Read(fileBytes, 0, fileBytes.Length); SaveBigFileModel model = new SaveBigFileModel() { FileName = fileName, Docid = CommonHelper.DecodeUrl(Request.Form["Docid"]), TokenId = CommonHelper.GetToken(Request.Form["TokenId"]), Rev = CommonHelper.DecodeUrl(Request.Form["Rev"]), UploadId = CommonHelper.DecodeUrl(Request.Form["UploadId"]), FileBytes = fileBytes, PartIndex = start, TotalParts = end, PartsInfo = CommonHelper.DecodeUrl(Request.Form["PartsInfo"]) }; IAS7APIHelper helper = new AS7APIHelper(); var uploadFileRes = helper.UploadBigFile(model); return(Json(new JsonModel { Success = true, StatusCode = uploadFileRes.ErrorCode, Data = JsonConvert.SerializeObject(uploadFileRes) })); } catch (Exception ex) { _log.Debug($"SaveBigFileToServer Exception: {ex.Message}"); return(Json(new JsonModel { Success = false, Message = ex.Message })); } }
/// <summary> /// 大文件上传 /// </summary> /// <param name="model">SaveBigFileModel</param> public UploadFileRes UploadBigFile(SaveBigFileModel model) { UploadFileRes uploadFileRes = new UploadFileRes(); try { var handler = new WebRequestHandler(); handler.ServerCertificateValidationCallback = delegate { return(true); }; using (var httpClient = new HttpClient(handler)) { httpClient.DefaultRequestHeaders.Add("Authorization", model.TokenId); byte[] buf = model.FileBytes; int writeSize = buf.Length; // 记录当前块写入的字节 Dictionary <string, List <object> > partInfo = new Dictionary <string, List <object> >(); if (!string.IsNullOrEmpty(model.PartsInfo)) { partInfo = JsonConvert.DeserializeObject <Dictionary <string, List <object> > >(model.PartsInfo); } // 文件body var json1 = "{\"docid\":\"" + model.Docid + "\",\"rev\":\"" + model.Rev + "\",\"uploadid\":\"" + model.UploadId + "\",\"parts\":\"" + model.PartIndex + "\"}"; var content1 = new StringContent(json1, Encoding.UTF8, "application/json"); var res1 = httpClient.PostAsync($"{Constant.OAuth2Url}/api/efast/v1/file/osuploadpart", content1).Result; var resStr1 = res1.Content.ReadAsStringAsync().Result; int resCode1 = (int)res1.StatusCode; // 若为错误返回码则抛出异常 if (resCode1 < 200 || resCode1 >= 300) { var errModel = JsonConvert.DeserializeObject <ErrorModel>(resStr1); _log.Debug($"UploadBigFile Osuploadpart Exception: {errModel.cause}, Code: {errModel.code}"); uploadFileRes.ErrorDetail = JsonConvert.SerializeObject(errModel.detail); uploadFileRes.ErrorCode = errModel.code; return(uploadFileRes); } var jResult = JsonConvert.DeserializeObject <AuthRequestsModel>(resStr1); var results = JsonConvert.DeserializeObject <Dictionary <string, List <string> > >(jResult.authrequests.ToString()); List <string> headers = new List <string>(); List <string> authRequestList = new List <string>(); results.TryGetValue(model.PartIndex.ToString(), out authRequestList); for (int i = 2; i < authRequestList.Count; ++i) { string header = authRequestList[i]; headers.Add(header); } string etag = null; OSSAPIHelper ossHttpHelper = new OSSAPIHelper(); // 文件块上传 using (HttpWebResponse ossResult = ossHttpHelper.SendReqToOSS(authRequestList[0], authRequestList[1], headers, buf)) { // 获取etag,由于报头中"etag"可能为"Etag","ETag","ETAG"等情况,故这里对报头key值进行遍历,将key值变为大写后与"ETAG"进行比较,若相等则让etag等于其value,退出循环。 WebHeaderCollection headerArray = ossResult.Headers; for (int i = 0; i < headerArray.Count; ++i) { string key = headerArray.GetKey(i); if (key.ToUpper().Equals("ETAG")) { etag = headerArray[key]; i = headerArray.Count; } } } List <object> tempList = new List <object>(); tempList.Add(etag); tempList.Add(writeSize); partInfo.Add(model.PartIndex.ToString(), tempList); uploadFileRes.FileName = JsonConvert.SerializeObject(partInfo); return(uploadFileRes); } } catch (Exception ex) { _log.Debug($"UploadBigFile Exception: {ex.Message}"); throw ex; } }