From c7bb0ee7e0239578cfb79cc5f855e8c376da3f4c Mon Sep 17 00:00:00 2001
From: Armand Bahi <armand.bahi@veremes.com>
Date: Thu, 24 Jan 2019 17:19:03 +0100
Subject: [PATCH] =?UTF-8?q?Retry=20sur=20la=20r=C3=A9cup=C3=A9ration=20du?=
 =?UTF-8?q?=20nom=20du=20fichier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../component/file_picker/file_picker.js      | 134 ++++++++++++------
 1 file changed, 91 insertions(+), 43 deletions(-)

diff --git a/src/vitis/client/javascript/externs/formReader/component/file_picker/file_picker.js b/src/vitis/client/javascript/externs/formReader/component/file_picker/file_picker.js
index 01b5306e..5e493a47 100644
--- a/src/vitis/client/javascript/externs/formReader/component/file_picker/file_picker.js
+++ b/src/vitis/client/javascript/externs/formReader/component/file_picker/file_picker.js
@@ -147,66 +147,114 @@ nsVitisComponent.FilePickerDirective = function ($timeout, $translate, propertie
 
                     for (var i = 0; i < aAvaliableFiles.length; i++) {
 
-                        ajaxRequest({
-                            'method': 'GET',
-                            'url': aAvaliableFiles[i],
-                            'headers': {
-                                'Accept': 'application/x-vm-json'
-                            },
-                            'scope': scope,
-                            'ajaxLoader': true,
-                            'responseType': 'blob',
-                            'success': function(response) {
-
-                                iCounter++;
-                                if (goog.isDefAndNotNull(response['data'])) {
-                                    var oBlob = response['data'];
-
-                                    if (goog.isDefAndNotNull(response['headers'])) {
-                                        if (goog.isString(response['headers']['content-disposition'])) {
-
-                                            var sName;
-                                            var aContentDisp = response['headers']['content-disposition'].split(';');
-                                            for (var i = 0; i < aContentDisp.length; i++) {
-                                                if(aContentDisp[i].indexOf('filename=') !== -1){
-                                                    sName = aContentDisp[i].split('"')[1];
-                                                }
-                                            }
-
-                                            if (sName) {
-                                                oBlob['name'] = sName;
-                                                // oBlob['lastModified'] = new Date().getTime();
-                                                // oBlob['lastModifiedDate'] = new Date();
-                                                // oBlob['webkitRelativePath'] = '';
+                        scope['downloadFileBlob'](aAvaliableFiles[i], 3).then(
+                            function success(oBlob){
 
-                                                // var oFile = new File([oBlob], sName, {
-                                                //     'type': scope['field']['type'] === 'image_wsdata' ? 'image' : ''
-                                                // });
+                                scope['aFiles'].push(oBlob);
 
-                                                // scope['aFiles'].push(oFile);
-                                            }
-                                        }
-                                    }
-                                    scope['aFiles'].push(oBlob);
-                                }
+                                iCounter++;
                                 if (iCounter === aAvaliableFiles.length) {
                                     deferred.resolve();
                                 }
+
                             },
-                            'error': function(response) {
+                            function error(){
                                 iCounter++;
                                 if (iCounter === aAvaliableFiles.length) {
                                     deferred.resolve();
                                 }
+                            });
+                    }
+                }
+
+                return deferred.promise;
+            }
+
+            /**
+             * Télécharge le blob d'un fichier depuis son URL
+             *
+             * @param  {string} sFileUrl URL du fichier
+             * @param  {number|undefined} iRetry Nombre de fois à retenter en cas de problème
+             * @return {promise} fonction prenant le blob en paramètre
+             */
+            scope['downloadFileBlob'] = function(sFileUrl, iRetry) {
+                $log.log("formReader.FilePickerDirective.downloadFileBlob " + iRetry);
+
+                var deferred = $q.defer();
+
+                ajaxRequest({
+                    'method': 'GET',
+                    'url': sFileUrl,
+                    'headers': {
+                        'Accept': 'application/x-vm-json'
+                    },
+                    'ajaxLoader': true,
+                    'responseType': 'blob',
+                    'success': function(response) {
+                        if (goog.isDefAndNotNull(response['data'])) {
+
+                            var oBlob = response['data'];
+
+                            // Trouve le nom du fichier
+                            var sFileName = scope['findFileNameInHeaders'](response['headers']);
+
+                            if (goog.isDefAndNotNull(sFileName)) {
+                                oBlob['name'] = sFileName;
+                                deferred.resolve(oBlob);
+                            } else {
+                                console.error('cannot get name from headers : ', response['headers']);
+
+                                // Retry
+                                if (goog.isDefAndNotNull(iRetry)) {
+                                    if (iRetry > 0) {
+                                        iRetry--;
+                                        scope['downloadFileBlob'](sFileUrl, iRetry).then(
+                                            function success(oBlob){
+                                                deferred.resolve(oBlob);
+                                            },
+                                            function error(){
+                                                deferred.reject();
+                                            }
+                                        );
+                                    }
+                                }
                             }
-                        });
 
+                        } else {
+                            deferred.reject();
+                        }
+                    },
+                    'error': function(response) {
+                        deferred.reject();
                     }
-                }
+                });
 
                 return deferred.promise;
             }
 
+            /**
+             * Récupère le nom du fichier depuis les headers
+             *
+             * @param  {object} oHeaders Headers
+             * @return {string}          Nom du fichier
+             */
+            scope['findFileNameInHeaders'] = function(oHeaders) {
+                var sName;
+
+                if (goog.isDefAndNotNull(oHeaders)) {
+                    if (goog.isString(oHeaders['content-disposition'])) {
+                        var aContentDisp = oHeaders['content-disposition'].split(';');
+                        for (var i = 0; i < aContentDisp.length; i++) {
+                            if(aContentDisp[i].indexOf('filename=') !== -1){
+                                sName = aContentDisp[i].split('"')[1];
+                            }
+                        }
+                    }
+                }
+
+                return sName;
+            }
+
             /**
              * Download the given file
              * @param  {object} oFile
-- 
GitLab