Unplanned
Last Updated: 21 Feb 2018 11:05 by ADMIN
When uploading a file to the CloudUpload control with an ’ apostrophe symbol in the name (Examples of the 3C’s.pdf), the control fails with 

Uncaught Error: Sys.ArgumentException: Cannot deserialize. The data does not correspond to valid JSON.
Parameter name: data
    at Function.Error.create (Telerik.Web.UI.WebResource.axd?_TSM_HiddenField_=ctl00_QsfScriptManager_TSM&compress=1&_TSM_CombinedScripts_=%3b%3bSystem.Web.Extensions%2c+Version%3d4.0.0.0%2c+Culture%3dneutral%2c+PublicKeyToken%3d31bf3856ad364e35%3aen-US%3ad28568d3-e53e-4706-928f-3765912b66ca%3aea597d4b%3ab25378d2:6)
    at Function.Error.argument (Telerik.Web.UI.WebResource.axd?_TSM_HiddenField_=ctl00_QsfScriptManager_TSM&compress=1&_TSM_CombinedScripts_=%3b%3bSystem.Web.Extensions%2c+Version%3d4.0.0.0%2c+Culture%3dneutral%2c+PublicKeyToken%3d31bf3856ad364e35%3aen-US%3ad28568d3-e53e-4706-928f-3765912b66ca%3aea597d4b%3ab25378d2:6)
    at Function.Sys.Serialization.JavaScriptSerializer.deserialize (Telerik.Web.UI.WebResource.axd?_TSM_HiddenField_=ctl00_QsfScriptManager_TSM&compress=1&_TSM_CombinedScripts_=%3b%3bSystem.Web.Extensions%2c+Version%3d4.0.0.0%2c+Culture%3dneutral%2c+PublicKeyToken%3d31bf3856ad364e35%3aen-US%3ad28568d3-e53e-4706-928f-3765912b66ca%3aea597d4b%3ab25378d2:6)
    at c.RadCloudUpload.HandlerUploader._successfulResponseStatus (RadCloudUploadScripts.js:477)
    at XMLHttpRequest.p (RadCloudUploadScripts.js:463)

Note, it's not the typical apostrophe. If you replace ’ with a normal ' windows apostrophe, the control uploads the file just fine.

In order to test, create any file on your system using that special character and try to upload that file using the demo application, located:

https://demos.telerik.com/aspnet-ajax/cloud-upload/examples/overview/defaultcs.aspx
Unplanned
Last Updated: 07 Nov 2018 15:31 by ADMIN
ADMIN
Created by: Dimitar
Comments: 0
Category: CloudUpload
Type: Bug Report
0
Affects RadCloudUpload and RadAsyncUpload combined with RadProgressArea. Manifests most often on slow networks or very large files.
Scroll down for workarounds for both cases.

WORKAROUND FOR PROGRESS AREA is to round down the data, as it seems the server reports more bytes uploaded than they actually are, and that tends to happen under slow network conditions

<telerik:RadAsyncUpload RenderMode="Lightweight" runat="server" ID="RadAsyncUpload1" MultipleFileSelection="Automatic" EnableInlineProgress="false" />
<telerik:RadProgressManager runat="server" ID="RadProgressManager1" />
<telerik:RadProgressArea RenderMode="Lightweight" runat="server" ID="RadProgressArea1" OnClientProgressUpdating="OnClientProgressUpdating" />
<script>
function OnClientProgressUpdating(sender, args) {
    //debugger
    if (args._progressData.PrimaryPercent > 100) {
        args._progressData.PrimaryPercent = 100;
    }
    if (args._progressData.PrimaryValue > args._progressData.PrimaryTotal) {
        args._progressData.PrimaryValue = args._progressData.PrimaryTotal;
    }
    console.log(args.get_progressData());
}
</script>

WORKAROUND FOR CLOUD UPLOAD is to add the following script at the end of the form that will override the built-in XHR handilng to change the way the totals are calculated:

        <script>
            Telerik.Web.UI.RadCloudUpload.HandlerUploader.prototype._initializeXmlHttpRequest = function () {
                this._xhr = new XMLHttpRequest();

                var that = this,
                    module = this._module,
                    xhr = this._xhr;

                xhr.onreadystatechange = function readyStateChanged() {
                    if (xhr.readyState == 4) {
                        if (xhr.status == 200) {
                            that._successfulResponseStatus(xhr);
                        }
                        else if (xhr.status != 0) {
                            that._failedResponseStatus(xhr);
                        }
                    }
                };

                xhr.upload.onprogress = function (event) {
                    that._uploadedSize += event.loaded;

                    var percents = Math.round((event.loaded / event.total) * 100) + "%";

                    module._renderingManager.updateRowProgress(that._uploadingEntity.row, percents, true);
                };
            }
        </script>