From 2e1e48160b2b999b323943e0d6a97c8a304a08c8 Mon Sep 17 00:00:00 2001
From: Armand Bahi <armand.bahi@veremes.com>
Date: Tue, 8 Jan 2019 15:50:23 +0100
Subject: [PATCH] Upload multiple files 1

---
 .../web_service/ws/Querys.class.inc           | 110 +++++++++++++-----
 src/vitis/vas/rest/index.phtml                |  43 ++++---
 2 files changed, 105 insertions(+), 48 deletions(-)

diff --git a/src/module_vmap/web_service/ws/Querys.class.inc b/src/module_vmap/web_service/ws/Querys.class.inc
index 3aed39da..5a835e75 100644
--- a/src/module_vmap/web_service/ws/Querys.class.inc
+++ b/src/module_vmap/web_service/ws/Querys.class.inc
@@ -51,6 +51,9 @@ class Querys extends Vmap {
         $this->aProperties = $properties;
         $this->aValues['getGroup'] = false;
         $this->oConnection = new Connection($this->aValues, $this->aProperties);
+
+        // error_log('$_FILES: '. print_r($_FILES, true));
+        // error_log('$aValues: '. print_r($this->aValues, true));
     }
 
     /**
@@ -841,7 +844,15 @@ class Querys extends Vmap {
 
                         foreach ($aLigne['bo_' . $type] as $key => $value) {
                             if (is_dir($sDataDir . "/" . $key)) {
-                                $aLigne['bo_' . $type][$key] = $sDataUrl . "/" . $key . "/" . $value . "?d=" . $date->getTimestamp();
+                                $aFiles = explode('|', $value);
+                                if (count($aFiles) > 1) {
+                                    $aLigne['bo_' . $type][$key] = [];
+                                    for ($i=0; $i < count($aFiles); $i++) {
+                                        array_push($aLigne['bo_' . $type][$key], $sDataUrl . "/" . $key . "/" . $aFiles[$i] . "?d=" . $date->getTimestamp());
+                                    }
+                                } else {
+                                    $aLigne['bo_' . $type][$key] = $sDataUrl . "/" . $key . "/" . $value . "?d=" . $date->getTimestamp();
+                                }
                             }
                         }
                     }
@@ -1451,7 +1462,7 @@ class Querys extends Vmap {
                 return $sMessage;
             }
             // Mise en place des fichiers
-            $this->aValues = $this->extractFilesFromValues($this->aValues, $sDirPath);
+            $this->aValues = $this->extractFiles($this->aValues, $sDirPath);
         }
 
         $aReturn = $this->genericPut($bo_schema, $bo_table, $bo_id_field);
@@ -1467,37 +1478,51 @@ class Querys extends Vmap {
         return $aReturn['sMessage'];
     }
 
-    /**
-     * Extract the files from aValues and modify the paths
-     * @param array $aValues
-     * @param string $sDirPath
-     * @param string $sFilePrefix
-     * @return array Parsed $aValues
-     */
-    function extractFilesFromValues($aValues, $sDirPath) {
+    function extractFile($aValues, $sName, $oFile, $sDirPath) {
 
-        foreach ($aValues as $key => $value) {
-            if (strrpos($key, '_file')) {
+        if (!empty($sName) && !empty($oFile['name']) && !empty($oFile['file'])) {
 
-                $sName = substr($key, 0, strrpos($key, '_file'));
-                $sFileName = $aValues[$sName . '_name'];
+            // Crée le dossier si besoin
+            $sDirColumnPath = $sDirPath . '/' . $sName;
+            if (!is_dir($sDirColumnPath)) {
+                mkdir($sDirColumnPath, 0777, true);
+            }
 
-                if (!empty($sFileName)) {
+            // Cŕee le fichier sur le serveur
+            $fp = fopen($sDirColumnPath . '/' . $oFile['name'], "w");
+            fwrite($fp, $oFile['file']);
+            fclose($fp);
 
-                    $sDirColumnPath = $sDirPath . '/' . $sName;
-                    if (!is_dir($sDirColumnPath)) {
-                        mkdir($sDirColumnPath, 0777, true);
-                    }
+            // Mise en place pour la base de données
+            if (empty($aValues[$sName])) {
+                $aValues[$sName] = $oFile['name'];
+            } else {
+                $aValues[$sName] .= '|' . $oFile['name'];
+            }
+
+            if (!empty($aValues[$sName . '_file'])) {
+                unset($aValues[$sName . '_file']);
+            }
+            if (!empty($aValues[$sName . '_name'])) {
+                unset($aValues[$sName . '_name']);
+            }
+        }
 
-                    // Cŕee le fichier sur le serveur
-                    $fp = fopen($sDirColumnPath . '/' . $sFileName, "w");
-                    fwrite($fp, $value);
-                    fclose($fp);
+        return $aValues;
+    }
 
-                    // Mise en place pour la base de données
-                    $aValues[$sName] = $aValues[$sName . '_name'];
-                    unset($aValues[$sName . '_file']);
-                    unset($aValues[$sName . '_name']);
+    function extractFiles($aValues, $sDirPath) {
+
+        foreach ($_FILES as $key => $value) {
+
+            if (!empty($value['file'])) {
+                $aValues = $this->extractFile($aValues, $key, $value, $sDirPath);
+            }
+            if (!empty($value[0])) {
+                for ($i=0; $i < count($value); $i++) {
+                    if (!empty($value[$i]['file'])) {
+                        $aValues = $this->extractFile($aValues, $key, $value[$i], $sDirPath);
+                    }
                 }
             }
         }
@@ -1620,6 +1645,7 @@ class Querys extends Vmap {
                 $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
                 return $sMessage;
             }
+
             // Écriture du fichier
             foreach ($_FILES as $sName => $aFile) {
 
@@ -1628,11 +1654,35 @@ class Querys extends Vmap {
                     mkdir($sDirColumnPath, 0777, true);
                 }
 
-                $this->aValues[$sName] = $aFile['name'];
+                // Fichiers multiples
+                if (is_array($aFile['name'])){
+
+                    $this->aValues[$sName] = "";
+                    for ($i=0; $i < count($aFile['name']); $i++) {
+
+                        // Remplace la valeur en base par le nom du fichier
+                        if (empty($this->aValues[$sName])) {
+                            $this->aValues[$sName] = $aFile['name'][$i];
+                        } else {
+                            $this->aValues[$sName] .= '|' . $aFile['name'][$i];
+                        }
+
+                        // Écrit le fichier dans son enplacement
+                        uploadFile($sName, "", $sDirColumnPath . "/" . $aFile['name'][$i], $aFile['size'][$i], $aFile['tmp_name'][$i]);
+                    }
+
+                }
+                // Fichier simple
+                else {
+
+                    // Remplace la valeur en base par le nom du fichier
+                    $this->aValues[$sName] = $aFile['name'];
 
-                // Écrit le fichier dans son enplacement
-                uploadFile($sName, "", $sDirColumnPath . "/" . $aFile['name'], $aFile['size'] + 1);
+                    // Écrit le fichier dans son enplacement
+                    uploadFile($sName, "", $sDirColumnPath . "/" . $aFile['name'], $aFile['size']);
+                }
             }
+
             $this->genericPut($bo_schema, $bo_table, $bo_id_field);
         }
 
diff --git a/src/vitis/vas/rest/index.phtml b/src/vitis/vas/rest/index.phtml
index d4b4cffa..e4a1f713 100755
--- a/src/vitis/vas/rest/index.phtml
+++ b/src/vitis/vas/rest/index.phtml
@@ -51,38 +51,45 @@ if (!empty($boundary)) {
         if (isset($headers['content-disposition'])) {
             $filename = null;
             preg_match(
-                    '/^(.+); *name="([^"]+)"(; *filename="([^"]+)")?/', $headers['content-disposition'], $matches
+                '/^(.+); *name="([^"]+)"(; *filename="([^"]+)")?/', $headers['content-disposition'], $matches
             );
             list(, $type, $name) = $matches;
             isset($matches[4]) and $filename = $matches[4];
             // handle your fields here
             // Ce champ est un fichier ()?
             if (!empty($filename)) {
+
                 // Internet Explorer passe le chemin complet vers le fichier.
                 $aFilenamePathInfo = pathinfo($filename);
                 $filename = $aFilenamePathInfo['filename'] . '.' . $aFilenamePathInfo['extension'];
-                //
-                $_PUTDATA[$name . "_file"] = substr($body, 0, strlen($body) - 2);
-                $_PUTDATA[$name . "_name"] = $filename;
-            } else
+
+                // Multiples documents
+                if (substr($name, -2) == '[]') {
+                    $_FILES[substr($name, 0, -2)][] = array(
+                        "file" => substr($body, 0, strlen($body) - 2),
+                        "name" => $filename
+                    );
+                }
+                // Documents simples
+                else {
+                    $_PUTDATA[$name . "_file"] = substr($body, 0, strlen($body) - 2);
+                    $_PUTDATA[$name . "_name"] = $filename;
+
+                    // Utilisation de $_FILES
+                    $_FILES[$name] = array(
+                        "file" => substr($body, 0, strlen($body) - 2),
+                        "name" => $filename
+                    );
+                }
+            } else {
                 $_PUTDATA[$name] = substr($body, 0, strlen($body) - 2);
-            /*
-              switch ($name) {
-              // this is a file upload
-              case 'userfile':
-              file_put_contents($filename, $body);
-              break;
-              // default for all other files is to populate $data
-              default:
-              $_PUTDATA[$name."_file"] = substr($body, 0, strlen($body) - 2);
-              $_PUTDATA[$name."_name"] = $filename;
-              break;
-              }
-             */
+            }
         }
     }
 }
 
+error_log('$_POST: '. print_r($_POST, true));
+error_log('$_FILES: '. print_r($_FILES, true));
 
 $aParamsJson = json_decode(file_get_contents('php://input'), true);
 if ($_PUTDATA != null) {
-- 
GitLab