2013-12-07 3 views
1

Я использую dropzone.js для загрузки определенных файлов на свой сервер. У меня есть проблема, что иногда сервер не в состоянии идти в ногу с подключениями и отказывается от некоторых загрузок, поэтому они будут терпеть неудачу и будут отмечены красным цветом с помощью x. Я хотел бы автоматически повторить попытку через определенное время или, по крайней мере, дать пользователю возможность перезапустить его вручную.Dropzone.js повторить попытку, если ajax не удалось

Есть ли реализованная функция в dropzone.js, достаточно простой способ реализовать ее для себя или есть лучший инструмент для выполнения этих любопытных загрузок с помощью перетаскивания, предварительного просмотра, ajax и т. Д.?

ответ

1

Чтобы изменить ситуацию, вам необходимо внести небольшую модификацию в dropzone.js, но в остальном это просто директива.
Моя dropzone теперь повторяет (бесконечно, но я исправлю это позже), пока это не удастся. Требуется немного больше работы, чтобы сбросить индикаторы выполнения, но этого должно быть достаточно, чтобы доставить вас куда-нибудь (если вам все еще нужно это делать).

Редактирование в dropzone.js является (в Приукрашена версии):

    success: function(file) { 
        file.previewElement.classList.remove("dz-error"); 
        return file.previewElement.classList.add("dz-success"); 
       } 

Где я добавил удалить строку. Это изменяет Xs на отметки, когда файл успешно загружается.
Угловая директива следующим образом:

.directive('dropZone', function($rootScope) { 
     return function ($scope, element, attr) { 
      var myDropZone = element.dropzone({ 
       url: "api/ImageUpload", 
       maxFilesize: 100, 
       paramName: "uploadfile", 
       maxThumbnailFilesize: 5, 
       autoProcessQueue: false, 
       parallelUploads: 99999, 
       uploadMultiple: false, 
       // this is my identifier so my backend can index the images together 
       params: {identifier: $scope.identifier}, 
       // I seem to need to do this when a file is added, otherwise it doesn't update 
       init: function(){this.on("addedfile", function(file){$rootScope.$digest();})} 
      }); 
      // grabbing the dropzone object and putting it somewhere the controller can reach it 
      $scope.dropZone = myDropZone.context.dropzone; 
      // what we use to work out if we're _really_ complete 
      $scope.errors = []; 
      // here is our retry mechanism 
      myDropZone.context.dropzone.addEventListener("error", function(file,errorMessage,xhr) 
      { 
       // log our failure so we don't accidentally complete 
       $scope.errors.push(file.name); 
       // retry! 
       myDropZone.context.dropzone.uploadFile(file); 
      }); 
      myDropZone.context.dropzone.addEventListener("success", function(file,errorMessage,xhr) 
      { 
       // remove from the error list once "success" (_not_ "complete")   
       $scope.errors.splice($scope.errors.indexOf(file.name), 1); 
      }); 
      // this gets called multiple times because of our "retry" 
      myDropZone.context.dropzone.addEventListener("queuecomplete", function() 
      { 
       // if we're here AND have no errors we're done 
       if($scope.errors.length == 0) 
       { 
         // this is my callback to the controller to state we're all done 
        $scope.uploadComplete(); 
       } 
      }); 
     }; 
    }) 

не уверен, что если все, что myDropZone.context.dropZone материал нужно, я своего рода сосать яваскрипта и тратить много своего времени console.logging() объектов и их изучение в отладчик. Вот где я нашел компонент dropzone, возможно, есть более простой способ?

+1

В целом это хорошо выглядит. Вам не нужно (и не следует) изменять dropzone.js, хотя! Просто зарегистрируйтесь на событие успеха в функции init и добавьте свой вызов там: 'this.on (« success », function (file) {file.previewElement.classList.remove (« dz-error »);}); 'Вы также должны добавить некоторый обратный отсчет, чтобы файлы не повторялись бесконечно. – enyo

0

Моя ситуация была немного иной, чем Quibblesome, но мое решение основывалось на их ответе ... так что спасибо Quibblesome !!!!

В моей ситуации аякс не терпел неудачу, поэтому dropzone.addEventListener («error», function (file, errorMessage, xhr) никогда не запускался. Поэтому я немного изменил решение Quibbomes, чтобы работать, даже если dropdzone вызвал успех.

var fileObj; 
 
clientDetailsDropZone = new Dropzone($("#clientDetailsDropZoneArea").get(0), { 
 
    init: function() 
 
\t { 
 
\t \t this.on("success", function(e,response) 
 
\t \t { 
 
\t \t //IF THE USERS authtoken is expired..... retry the upload automatically 
 
\t \t \t if(!authToken.isValid) 
 
\t \t \t { 
 
\t \t \t \t //Get a new Token and then autmoatically re upload -- getFileAuthToken is another ajax call that authorizes the user 
 
\t \t \t \t getFileAuthToken(function f(e){ 
 
\t \t \t \t \t this.uploadFile(fileObj); \t \t \t \t 
 
\t \t \t \t }); 
 
\t \t \t } 
 
\t \t \t else 
 
\t \t \t { \t //They had a good token and the upload worked 
 
\t \t \t \t alert("yay your upload worked!"); 
 
\t \t \t } 
 
\t \t }); 
 

 
\t \t this.on("addedfile", function(file) { 
 
\t \t \t fileObj = file; 
 
\t \t }); 
 
\t } 
 
});

1

Мое решение без изменения библиотеки Dropzone и только 4 строки длиной стараюсь файл загрузить в два раза, так как первый неудачный запрос устанавливает новый печенье на основе CSRF токен:.

var isFirstTry = true; 

myDropzone = new Dropzone(document.body, { 
    init: function() { 
     this.on("sending", function(file, xhr, formData) { 
      xhr.setRequestHeader("X-CSRF", Cookies.get('CSRF')); 
     }); 
    }, 
    error: function(file, errorMessage, xhr){ 
     if (errorMessage && errorMessage.status === 405 && file && isFirstTry) { 
      isFirstTry = false; 


      //remove item from preview 
      this.removeFile(file) 

      //duplicate File objet 
      new File([file], file.name, { type: file.type }); 




      this.uploadFile(file); 
     } 
    }, 
    // other configs 
}); 

After dropzone error Событие, падение зоны пожаров complete Событие независимо от того, что является результатом. По завершении dropzone установите элемент состояния complete. Это скрывает индикатор выполнения. Чтобы предотвратить это поведение, скопируйте объект File. Это предотвратит complete hook для обработки нового элемента предварительного просмотра.

+0

спасибо, может быть, даже addFile вместо uploadFile – oak

+0

кажется, что addFile создает новый список, но нет нового индикатора для нового элемента – oak

+0

ok Я нашел решение. Я отредактировал ответ – oak

Смежные вопросы