Некорректная скорость загрузки отображается при загрузке файла в Amazon S3 с использованием SDK и Uploadify

В моем приложении ASP.NET MVC (С#) используется Uploadify для загрузки файлов на Amazon S3 с использованием SDK для .NET, но он показывает неправильный уровень загрузки.

Когда я загружаю файл непосредственно на наш сервер, используя Uploadify, он отлично работает. Однако, когда я загружаю файл с использованием метода Amazon S3 TransferUtility.Upload, индикатор выполнения показывает 100% -ное завершение быстро, но мне нужно долго ждать, чтобы достичь события Uploadify onComplete. Мой код показан ниже.

Код С#:

using (transferUtility = new TransferUtility(AWSAccessKey, AWSSecretKey))
{
    try
    {
        TransferUtilityUploadRequest request = new TransferUtilityUploadRequest();

        request.WithBucketName(AWSBucket)
            .WithKey(folderKey)
            .WithTimeout(5 * 60 * 1000)
            .WithInputStream(uploadFileStream);

        request.WithCannedACL(S3CannedACL.PublicRead);

        transferUtility.Upload(request);
    }                
    catch (AmazonS3Exception amazonS3Exception)
    {
        throw amazonS3Exception;
    }
}

Код JavaScript:

jQuery(document).ready(function () {
    var allowdfileext='*.doc;*.docx;*.pdf;'
    var extarray=allowdfileext.split(';');

    jQuery('#proposalUploadFile').uploadify({
        'uploader': '/Content/uploadify/uploadify.swf',
        'script': '/File/Upload',
        'folder': '/uploads',
        'buttonImg':'/Content/uploadify/upload-file.jpg',
        'cancelImg': '/Content/uploadify/cancel.png',
        'auto': true,            
        'height': '25',
        'width': '95', 
        'wmode':'transparent',
        'sizeLimit': '20971520',
        'onComplete': fileUploaded,
        'multi': false,
        'scriptData': {
            'saveToFolder': 'Temp',
            'fileextension':'*.doc;*.docx;*.pdf;',
            'subdomain':'qa','saveInLocal':'True'
        },
        'fileExt':'*.doc;*.docx;*.pdf;',
        'fileDesc':'Files (*.doc;*.docx;*.pdf;)',
        'onAllComplete': fileUploadCompleted,
        'onError' : function(event, ID, fileObj, errorObj) {
            var r = '<br />ERROR: ';

            switch(errorObj.info) {
                case 405:
                    r += 'Invalid file type.';
                    break;
                case 406:
                    r += 'Some other error.';
                    break;
                default:
                    r += 'Some other error.';
                    break;
            }       
        }
    });
});

Почему не обновляется индикатор выполнения, как я ожидаю?

Ответ 1

По существу, происходит две загрузки. Однажды с веб-страницы на ваш сервер и один раз с вашего сервера на облако.

То, что вы видите, - это продвижение загрузки с веб-страницы на ваш обработчик загрузки. Браузер знает только данные, отправляемые от клиента на ваш сервер, а не данные, отправляемые с вашего сервера на S3.

Не выполняя довольно сложную работу на сервере, получение точного значения прогресса загрузки невозможно. Я бы рекомендовал либо отключить фоновый поток для обработки загрузки на S3, либо установить прогресс на что-то менее 100%, пока не будет выполнен полный обратный вызов.

Ответ 2

Как передается TransferUtility со стороны сервера обратно клиенту SWF? Я бы предположил, что загрузка с клиента на сервер будет отражена в индикаторе выполнения. Затем передача сервера на S3 будет (гораздо медленнее, чем запись в локальный файл), который не будет сообщаться клиенту (swf). Это будет означать задержку между загрузкой, достигающей 100%, а затем придется ждать ответа страницы.

Ответ 3

Обычно существует раздел конфигурации, в котором вы можете установить время для обновления состояния прогресса в поставщике состояния. В вашем случае я предполагаю, что должно быть что-то вроде этого.

В neatUpload этот конфиг устанавливается stateMergeIntervalSeconds. Я надеюсь, что эта помощь.