Пример #1
0
        private async Task <PNResult <PNFileUploadResult> > ProcessFileUpload(Dictionary <string, object> externalQueryParam)
        {
            PNResult <PNFileUploadResult> ret = new PNResult <PNFileUploadResult>();

            if (string.IsNullOrEmpty(this.sendFileName))
            {
                PNStatus errStatus = new PNStatus {
                    Error = true, ErrorData = new PNErrorData("Missing File", new ArgumentException("Missing File"))
                };
                ret.Status = errStatus;
                return(ret);
            }


            PNResult <PNGenerateFileUploadUrlResult> generateFileUploadUrl = await GenerateFileUploadUrl(externalQueryParam).ConfigureAwait(false);

            PNGenerateFileUploadUrlResult generateFileUploadUrlResult = generateFileUploadUrl.Result;
            PNStatus generateFileUploadUrlStatus = generateFileUploadUrl.Status;

            if (generateFileUploadUrlStatus.Error || generateFileUploadUrlResult == null)
            {
                PNStatus errStatus = new PNStatus {
                    Error = true, ErrorData = new PNErrorData("Error in GenerateFileUploadUrl. Try again.", new ArgumentException("Error in GenerateFileUploadUrl. Try again."))
                };
                ret.Status = errStatus;
                return(ret);
            }
            LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity);

            RequestState <PNFileUploadResult> requestState = new RequestState <PNFileUploadResult>();

            requestState.ResponseType      = PNOperationType.PNFileUploadOperation;
            requestState.Reconnect         = false;
            requestState.EndPointOperation = this;

            requestState.UsePostMethod = true;

            byte[] sendFileByteArray = GetByteArrayFromFilePath(sendFileFullPath);

            string dataBoundary     = String.Format("----------{0:N}", Guid.NewGuid());
            string contentType      = "multipart/form-data; boundary=" + dataBoundary;
            string currentCipherKey = !string.IsNullOrEmpty(this.currentFileCipherKey) ? this.currentFileCipherKey : config.CipherKey;

            byte[] postData = GetMultipartFormData(sendFileByteArray, generateFileUploadUrlResult.FileName, generateFileUploadUrlResult.FileUploadRequest.FormFields, dataBoundary, currentCipherKey, config, pubnubLog);

            Tuple <string, PNStatus> JsonAndStatusTuple = await UrlProcessRequest(new Uri(generateFileUploadUrlResult.FileUploadRequest.Url), requestState, false, postData, contentType).ConfigureAwait(false);

            ret.Status = JsonAndStatusTuple.Item2;
            string json = JsonAndStatusTuple.Item1;

            if (!string.IsNullOrEmpty(json))
            {
                LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity);                //do internal publish after successful file upload

                Dictionary <string, object> publishPayload = new Dictionary <string, object>();
                if (this.publishMessage != null && !string.IsNullOrEmpty(this.publishMessage.ToString()))
                {
                    publishPayload.Add("message", this.publishMessage);
                }
                currentFileId = generateFileUploadUrlResult.FileId;
                publishPayload.Add("file", new Dictionary <string, string> {
                    { "id", generateFileUploadUrlResult.FileId },
                    { "name", generateFileUploadUrlResult.FileName }
                });

                int  publishFileRetryLimit = config.FileMessagePublishRetryLimit;
                int  currentFileRetryCount = 0;
                bool publishFailed         = false;
                do
                {
                    currentFileRetryCount += 1;
                    PNResult <PNPublishFileMessageResult> publishFileMessageResponse = await PublishFileMessage(publishPayload, queryParam).ConfigureAwait(false);

                    PNPublishFileMessageResult publishFileMessage = publishFileMessageResponse.Result;
                    PNStatus publishFileMessageStatus             = publishFileMessageResponse.Status;
                    if (!publishFileMessageStatus.Error && publishFileMessage != null)
                    {
                        publishFailed = false;
                        PNFileUploadResult result = new PNFileUploadResult();
                        result.Timetoken = publishFileMessage.Timetoken;
                        result.FileId    = generateFileUploadUrlResult.FileId;
                        result.FileName  = generateFileUploadUrlResult.FileName;
                        ret.Result       = result;
                        ret.Status.Error = false;
                        LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload -> PublishFileMessage -> OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity);                //do internal publish after successful file upload
                    }
                    else
                    {
                        publishFailed = true;
                        ret.Status    = publishFileMessageStatus;
                        LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} PublishFileMessage Failed. currentFileRetryCount={1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), currentFileRetryCount), config.LogVerbosity);
#if !NET35 && !NET40
                        Task.Delay(1000).Wait();
#else
                        Thread.Sleep(1000);
#endif
                    }
                }while (publishFailed && currentFileRetryCount <= publishFileRetryLimit);
            }

            return(ret);
        }
Пример #2
0
        private void ProcessFileUpload(Dictionary <string, object> externalQueryParam, PNCallback <PNFileUploadResult> callback)
        {
            PNResult <PNGenerateFileUploadUrlResult> generateFileUploadUrl       = GenerateFileUploadUrl(externalQueryParam).Result;
            PNGenerateFileUploadUrlResult            generateFileUploadUrlResult = generateFileUploadUrl.Result;
            PNStatus generateFileUploadUrlStatus = generateFileUploadUrl.Status;

            if (generateFileUploadUrlStatus.Error || generateFileUploadUrlResult == null)
            {
                PNStatus errStatus = new PNStatus {
                    Error = true, ErrorData = new PNErrorData("Error in GenerateFileUploadUrl. Try again.", new ArgumentException("Error in GenerateFileUploadUrl. Try again."))
                };
                if (callback != null)
                {
                    callback.OnResponse(null, errStatus);
                }
                return;
            }
            LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity);

            RequestState <PNFileUploadResult> requestState = new RequestState <PNFileUploadResult>();

            requestState.ResponseType      = PNOperationType.PNFileUploadOperation;
            requestState.PubnubCallback    = callback;
            requestState.Reconnect         = false;
            requestState.EndPointOperation = this;

            requestState.UsePostMethod = true;

            byte[] sendFileByteArray = GetByteArrayFromFilePath(sendFileFullPath);


            string dataBoundary     = String.Format("----------{0:N}", Guid.NewGuid());
            string contentType      = "multipart/form-data; boundary=" + dataBoundary;
            string currentCipherKey = !string.IsNullOrEmpty(this.currentFileCipherKey) ? this.currentFileCipherKey : config.CipherKey;

            byte[] postData = GetMultipartFormData(sendFileByteArray, generateFileUploadUrlResult.FileName, generateFileUploadUrlResult.FileUploadRequest.FormFields, dataBoundary, currentCipherKey, config, pubnubLog);

            string json;

            UrlProcessRequest(new Uri(generateFileUploadUrlResult.FileUploadRequest.Url), requestState, false, postData, contentType).ContinueWith(r =>
            {
                json = r.Result.Item1;
                if (!string.IsNullOrEmpty(json) && string.Compare(json, "{}", StringComparison.CurrentCultureIgnoreCase) == 0)
                {
                    LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity);
                    //do internal publish after successful file upload

                    Dictionary <string, object> publishPayload = new Dictionary <string, object>();
                    if (this.publishMessage != null && !string.IsNullOrEmpty(this.publishMessage.ToString()))
                    {
                        publishPayload.Add("message", this.publishMessage);
                    }
                    publishPayload.Add("file", new Dictionary <string, string> {
                        { "id", generateFileUploadUrlResult.FileId },
                        { "name", generateFileUploadUrlResult.FileName }
                    });

                    int publishFileRetryLimit = config.FileMessagePublishRetryLimit;
                    int currentFileRetryCount = 0;
                    bool publishFailed        = false;
                    do
                    {
                        currentFileRetryCount += 1;
                        PNResult <PNPublishFileMessageResult> publishFileMessageResponse = PublishFileMessage(publishPayload, queryParam).Result;
                        PNPublishFileMessageResult publishFileMessage = publishFileMessageResponse.Result;
                        PNStatus publishFileMessageStatus             = publishFileMessageResponse.Status;
                        if (!publishFileMessageStatus.Error && publishFileMessage != null)
                        {
                            publishFailed             = false;
                            PNFileUploadResult result = new PNFileUploadResult();
                            result.Timetoken          = publishFileMessage.Timetoken;
                            result.FileId             = generateFileUploadUrlResult.FileId;
                            result.FileName           = generateFileUploadUrlResult.FileName;
                            LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} GenerateFileUploadUrl -> file upload -> PublishFileMessage -> OK.", DateTime.Now.ToString(CultureInfo.InvariantCulture)), config.LogVerbosity);
                            r.Result.Item2.Error = false;
                            callback.OnResponse(result, r.Result.Item2);
                        }
                        else
                        {
                            publishFailed = true;
                            if (currentFileRetryCount == publishFileRetryLimit)
                            {
                                callback.OnResponse(null, publishFileMessageStatus);
                            }
                            LoggingMethod.WriteToLog(pubnubLog, string.Format("DateTime {0} PublishFileMessage Failed. currentFileRetryCount={1}", DateTime.Now.ToString(CultureInfo.InvariantCulture), currentFileRetryCount), config.LogVerbosity);
#if !NET35 && !NET40
                            Task.Delay(1000).Wait();
#else
                            Thread.Sleep(1000);
#endif
                        }
                    }while (publishFailed && currentFileRetryCount <= publishFileRetryLimit);
                }
                else
                {
                    if (r.Result.Item2 != null)
                    {
                        callback.OnResponse(null, r.Result.Item2);
                    }
                }
            }, TaskContinuationOptions.ExecuteSynchronously).Wait();
        }