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