Индикатор выполнения Grails jQuery UI

#jquery #grails

#jquery #grails

Вопрос:

Я пытаюсь использовать индикатор выполнения пользовательского интерфейса jQuery в приложении Grails для загрузки файла. Я использую g: uploadForm для отправки файла, и я не уверен, как получить доступ к объекту XMLHttpRequest, чтобы отслеживать прогресс в передаче потока байтов, чтобы я мог передать параметры на панель выполнения jQuery UI для обновления. Вот что я пытаюсь до сих пор, но безуспешно. Я был бы очень признателен за любые рекомендации.

 $("#progressbar").progressbar({
            value: false,
            change: function() {
                $(".progress-label").text( $("#uploadErrors").progressbar( "value" )   "%" );
            },
            complete: function() {
                $(".progress-label").text( "Complete!" );
            }
        });
        $(".uploaderForm").submit();
        //var fileSize = $("#chseFile")[0].files[0].size;

        var request = new XMLHttpRequest();

        request.upload.addEventListener('progress', function(event) {
            var percent = event.loaded / event.total;
            console.log(percent);
            $("#progressbar").progressbar( "value", percent * 100 );
        });
  

Метод загрузки контроллера довольно прост, потому что он просто передает работу службе:

 def upload() {

    params.selectedBatch = selectedBatch

    // Diag
    println "*** Request info: "   request
    println "*** Session info: "   request.getSession()
    println "*** Servlet context: "   request.getSession().getServletContext()

    def f = request.getFile('file')

    if (f.empty) {
        println "File cannot be empty!"
    }

    else {
            // The case that we have an Excel file upload. This if statement might need to be
            // a switch statement in the future when we start accepting other upload formats like
            // CSV and/or XML.
            if (params.fileTypegrp.toInteger() == 1) {

                // We know its an Excel file, now we use a switch for the data type.    
                switch (params.dataTypegrp.toInteger()) {
                    case 1:
                        fileImportService.excelAccountFileUpload(params)
                        println "upload complete!"
                        break
.
.
.
  

Комментарии:

1. Я знаю, что на самом деле это не ответ на ваш вопрос, но рассматривали ли вы возможность использования одного из плагинов для загрузки файлов, таких как uploadr ?

2. Я не изучал это. Я видел несколько плагинов, но они казались немного старше, поэтому я не был уверен, что они все еще применяются, но я рассмотрю это. Спасибо.

3. Можете ли вы также вставить сюда свой код контроллера? Я уже делал индикатор выполнения jquery раньше с GRAILS, но без использования g:uploadForm.

4. @LalitAgarwal Я добавил соответствующий код контроллера. Любые советы приветствуются. Спасибо за проявленный интерес к моему вопросу.

5. @AnonymousHuman Извините, я пропустил ваше редактирование и добавил, как я это сделал. Пожалуйста, взгляните на мой ответ и попробуйте его.

Ответ №1:

UploadController.groovy

 import grails.web.JSONBuilder

def uploadFile = {        
    if (request instanceof MultipartHttpServletRequest) {
        for (filename in request.fileNames) {

            def uploadedMessage = StringUtils.EMPTY

            MultipartFile file = request.getFile(filename)

            JSONBuilder jSON = new JSONBuilder()
            JSON json = jSON.build {
                name = file.originalFilename
                size = file.size                    
            }

            results = json.toString()
       }
  }

  render results
}
  

Загрузить.gsp

 <input id="fileupload" type="file" name="files[]" multiple>

<div id="progress" class="progress">
            <div class="progress-bar"></div>
</div>

<script>
        jQuery('#fileupload').fileupload({
          url: 'uploadFile',
          dataType: 'json',
          progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);
            jQuery('#progress .progress-bar').css(
                    'width',
                    progress   '%'
            );                
         }
        });

</script>
  

Я не пробовал этот код полностью, но это должно сработать, если вы получаете какие-либо ошибки, пожалуйста, добавьте комментарий. Я предполагаю, что у вас есть все необходимые JS и CSS добавлены.

К вашему сведению: я использую: http://blueimp.github.io/jQuery-File-Upload /

Комментарии:

1. Я пытался реализовать это решение, но я просто не могу понять, как правильно настроить Javascript. Я отказался от наличия индикатора выполнения после недели борьбы.

2. @AnonymousHuman Я понимаю, что довольно сложно сделать все правильно, когда дело доходит до индикаторов выполнения. Я также столкнулся с множеством трудностей при его реализации. Тем не менее, я посмотрю, смогу ли я написать для него сообщение в блоге в эти выходные с примером проекта grails.