Beispiel #1
0
        /// <summary>
        /// 执行上传
        /// </summary>
        /// <param name="p_uploadFiles">待上传文件</param>
        /// <param name="p_fixedvolume">要上传的固定卷名,null表示上传到普通卷</param>
        /// <param name="p_tokenSource">取消上传的令牌,不负责释放</param>
        /// <returns></returns>
        public static async Task <List <string> > Send(IList <FileData> p_uploadFiles, string p_fixedvolume, CancellationTokenSource p_tokenSource)
        {
            // 列表内容不可为null
            if (p_uploadFiles == null ||
                p_uploadFiles.Count == 0 ||
                p_uploadFiles.Contains(null))
            {
                return(null);
            }

            var bodyBuilder = new MultipartBody.Builder().SetType(MultipartBody.Form);

            if (!string.IsNullOrEmpty(p_fixedvolume))
            {
                // 固定上传路径放在最前
                bodyBuilder.AddFormDataPart("fixedvolume", p_fixedvolume);
            }

            foreach (var uf in p_uploadFiles)
            {
                Java.IO.File file = new Java.IO.File(uf.FilePath);
                RequestBody  rb   = RequestBody.Create(file, MediaType.Parse("application/octet-stream"));
                // 包一层实现进度
                ProgressRequestBody progress = new ProgressRequestBody(rb, ((IUploadUI)uf.UploadUI).UploadProgress);
                bodyBuilder.AddFormDataPart(uf.Desc, uf.FileName, progress);

                // 含缩略图
                if (!string.IsNullOrEmpty(uf.ThumbPath))
                {
                    var thumbFile = new Java.IO.File(uf.ThumbPath);
                    var thumb     = RequestBody.Create(thumbFile, MediaType.Parse("application/octet-stream"));
                    bodyBuilder.AddFormDataPart("thumbnail", "thumbnail.jpg", thumb);
                }
            }
            RequestBody body = bodyBuilder.Build();

            var request = new Request.Builder()
                          .Post(body)
                          .Url($"{Kit.Stub.ServerUrl.TrimEnd('/')}/fsm/.u");

            if (Kit.IsLogon)
            {
                request.Header("uid", Kit.UserID.ToString());
            }

            var call = _client.NewCall(request.Build());

            p_tokenSource.Token.Register(() => Task.Run(() => call.Cancel()));
            _tokenSource = p_tokenSource;

            Response resp;

            try
            {
                resp = await call.EnqueueAsync().ConfigureAwait(false);
            }
            catch
            {
                return(null);
            }
            finally
            {
                _tokenSource = null;
            }

            var result = resp.Body().Bytes();

            if (result == null || result.Length == 0)
            {
                return(null);
            }
            return(ParseResult(result));
        }