From f191f1c11fdf7269a025a0d1f1973541567b8298 Mon Sep 17 00:00:00 2001
From: Armand Bahi <armand.bahi@veremes.com>
Date: Wed, 9 Jan 2019 14:26:04 +0100
Subject: [PATCH] =?UTF-8?q?Fournit=20une=20structure=20identique=20=C3=A0?=
 =?UTF-8?q?=20l'upload=20de=20fichier=20dans=20$=5FFILES?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 vas/rest/index.phtml | 94 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 73 insertions(+), 21 deletions(-)

diff --git a/vas/rest/index.phtml b/vas/rest/index.phtml
index e4a1f713..aa94a7d1 100755
--- a/vas/rest/index.phtml
+++ b/vas/rest/index.phtml
@@ -63,24 +63,13 @@ if (!empty($boundary)) {
                 $aFilenamePathInfo = pathinfo($filename);
                 $filename = $aFilenamePathInfo['filename'] . '.' . $aFilenamePathInfo['extension'];
 
-                // 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
-                    );
-                }
+                // [DEPRECATED]
+                $_PUTDATA[$name . "_file"] = substr($body, 0, strlen($body) - 2);
+                $_PUTDATA[$name . "_name"] = $filename;
+
+                // Extrait les fichiers de aValues dans $_FILES
+                extractPutFileStruct($name, $filename, substr($body, 0, strlen($body) - 2), $properties);
+
             } else {
                 $_PUTDATA[$name] = substr($body, 0, strlen($body) - 2);
             }
@@ -88,13 +77,12 @@ if (!empty($boundary)) {
     }
 }
 
-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) {
     $aValues = array_merge($_REQUEST, $_PUTDATA);
 } else {
+    // Réorganise $_FILES pour les fichiers multiples
+    extractPostFileStruct();
     $aValues = $_REQUEST;
 }
 if ($aParamsJson != null) {
@@ -207,5 +195,69 @@ function customErrorHandler ($errno, $errstr, $errfile, $errline, $context){
     }
 }
 
+
+/**
+ * Extract the PUT upload files structure and put them into $_FILES
+ *
+ * @param  {string} $sField       Field name
+ * @param  {string} $sFileName    File name
+ * @param  {string} $sFileContent File content
+ * @param  {array}  $properties   properties
+ */
+function extractPutFileStruct($sField, $sFileName, $sFileContent, $properties) {
+
+    // Crée un fichier dans tmp
+    $sTmpFile = $properties['extract_dir'] . "/" . getUniqRandomId();
+    $oFile = fopen($sTmpFile, 'w+');
+    if (!$oFile){
+        writeToErrorLog("Can't open file in " . $properties['extract_dir']);
+        return null;
+    }else{
+        fwrite($oFile, $sFileContent);
+        fclose($oFile);
+        $aFileStruc = array(
+            "name" => $sFileName,
+            "tmp_name" => $sTmpFile,
+            "error" => "0",
+            "size" => filesize($sTmpFile)
+        );
+    }
+
+    // Fichiers simples
+    if (substr($sField, -2) != '[]') {
+        $_FILES[$sField] = $aFileStruc;
+    }
+    // Fichiers multiples
+    if (substr($sField, -2) == '[]') {
+        $_FILES[substr($sField, 0, -2)][] = $aFileStruc;
+    }
+}
+
+/**
+ * Extract the POST upload multiple files into a common structure
+ *
+ */
+function extractPostFileStruct() {
+
+    foreach ($_FILES as $key => $value) {
+
+        // Fichier multiple
+        if (is_array($value['name'])) {
+
+            $aFiles = [];
+            for ($i=0; $i < count($value['name']); $i++) {
+
+                $aFile = [];
+                foreach ($value as $key2 => $value2) {
+
+                    $aFile[$key2] = $value[$key2][$i];
+                }
+                array_push($aFiles, $aFile);
+            }
+            $_FILES[$key] = $aFiles;
+        }
+    }
+}
+
 include ("index.vhtml");
 ?>
-- 
GitLab