示例#1
0
        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;
            }
        }