Gestion de l'upload côté server ok.

Création du module 'upload' et modification de 'ModuleRequest' pour transformer un fichier ($_FILES) en paramètre passé au module
This commit is contained in:
xdrm-brackets 2016-04-20 14:40:44 +02:00
parent b94c2fcd05
commit 2556448a9c
10 changed files with 172 additions and 80 deletions

View File

@ -177,6 +177,17 @@
} }
} }
} },
"upload": {
"call_log": {
"description": "Upload d'un journal d'appel au format .xml.",
"permissions": ["admin"],
"parameters": {
"file": { "description": "Fichier du journal d'appel", "type": "FILE" }
}
}
}
} }

View File

@ -1,6 +1,6 @@
{ {
"root": "/src/dynamic/", "root": "/src/upload/",
"auth": [ "directories": [
"call_log", "call_log",
"spss", "spss",
"pspp" "pspp"

View File

@ -7,4 +7,4 @@ sociogramClass.prototype.arrange=function(a,b,d){var c=this.sigma.graph.nodes(a)
Math.PI;for(var g=0;g<c.length;g++)if(Math.abs(d-c[g])>Math.PI/10){e=!0;break}}while(e);a.x=b.x+this.nodeDistance*Math.cos(d);a.y=b.y+this.nodeDistance*Math.sin(d);this.arrange(a.id)}this.sigma.refresh()}};sociogramClass.prototype.overload.nodeNeighbors=function(a){a=this.allNeighborsIndex[a];var b=[],d;for(d in a)b.push(d);for(;0<b.length;){d=this.allNeighborsIndex[b[0]];for(var c in d)null==a[c]&&(b.push(c),a[c]=d[c]);b.shift()}return a};sociogramClass.prototype.overload.nodeDirectNeighbors=function(a){return this.allNeighborsIndex[a]}; Math.PI;for(var g=0;g<c.length;g++)if(Math.abs(d-c[g])>Math.PI/10){e=!0;break}}while(e);a.x=b.x+this.nodeDistance*Math.cos(d);a.y=b.y+this.nodeDistance*Math.sin(d);this.arrange(a.id)}this.sigma.refresh()}};sociogramClass.prototype.overload.nodeNeighbors=function(a){a=this.allNeighborsIndex[a];var b=[],d;for(d in a)b.push(d);for(;0<b.length;){d=this.allNeighborsIndex[b[0]];for(var c in d)null==a[c]&&(b.push(c),a[c]=d[c]);b.shift()}return a};sociogramClass.prototype.overload.nodeDirectNeighbors=function(a){return this.allNeighborsIndex[a]};
sociogramClass.prototype.extractNodesFromResponse=function(){this.nodes=[];for(var a=0;a<this.response.data.alter.length;a++)this.nodes.push({id:"n-"+this.response.data.alter[a][0],label:this.response.data.alter[a][1],x:0,y:0,size:this.response.data.alter[a][2]})}; sociogramClass.prototype.extractNodesFromResponse=function(){this.nodes=[];for(var a=0;a<this.response.data.alter.length;a++)this.nodes.push({id:"n-"+this.response.data.alter[a][0],label:this.response.data.alter[a][1],x:0,y:0,size:this.response.data.alter[a][2]})};
sociogramClass.prototype.extractEdgesFromResponse=function(){this.edges=[];for(var a=0;a<this.response.data.inter.length;a++)this.edges.push({id:"e-"+this.response.data.inter[a][0]+"-"+this.response.data.inter[a][1],source:"n-"+this.response.data.inter[a][0],target:"n-"+this.response.data.inter[a][1]})};sociogramClass.prototype.addNodes=function(){for(var a=0;a<this.nodes.length;a++)this.sigma.graph.addNode(this.nodes[a])};sociogramClass.prototype.addEdges=function(){for(var a=0;a<this.edges.length;a++)this.sigma.graph.addEdge(this.edges[a])}; sociogramClass.prototype.extractEdgesFromResponse=function(){this.edges=[];for(var a=0;a<this.response.data.inter.length;a++)this.edges.push({id:"e-"+this.response.data.inter[a][0]+"-"+this.response.data.inter[a][1],source:"n-"+this.response.data.inter[a][0],target:"n-"+this.response.data.inter[a][1]})};sociogramClass.prototype.addNodes=function(){for(var a=0;a<this.nodes.length;a++)this.sigma.graph.addNode(this.nodes[a])};sociogramClass.prototype.addEdges=function(){for(var a=0;a<this.edges.length;a++)this.sigma.graph.addEdge(this.edges[a])};
sociogramClass.prototype.bindings.clickNode=function(a,b){console.log(a);var d=b.data.node.id,c=a.sigma.graph.nodeNeighbors(d);c[d]=b.data.node;a.sigma.graph.nodes().forEach(function(a){a.color=null!=c[a.id]?a.originalColor:"#eee"});a.sigma.refresh()};sociogramClass.prototype.bindings.clickStage=function(a,b){a.sigma.graph.nodes().forEach(function(a){a.color=a.originalColor});a.sigma.refresh()}; sociogramClass.prototype.bindings.clickNode=function(a,b){console.log(a);var d=b.data.node.id,c=a.sigma.graph.nodeNeighbors(d);c[d]=b.data.node;a.sigma.graph.nodes().forEach(function(a){a.color=null!=c[a.id]?a.originalColor:"#888"});a.sigma.refresh()};sociogramClass.prototype.bindings.clickStage=function(a,b){a.sigma.graph.nodes().forEach(function(a){a.color=a.originalColor});a.sigma.refresh()};

View File

@ -456,7 +456,7 @@ sociogramClass.prototype.bindings.clickNode = function(thisPtr, e){
thisPtr.sigma.graph.nodes().forEach(function(n) { thisPtr.sigma.graph.nodes().forEach(function(n) {
if( neighborNodes[n.id] != null ) n.color = n.originalColor; if( neighborNodes[n.id] != null ) n.color = n.originalColor;
else n.color = '#eee'; else n.color = '#888';
}); });
thisPtr.sigma.refresh(); thisPtr.sigma.refresh();

7
js/lib/api-min.js vendored
View File

@ -1,5 +1,4 @@
function APIClass(b){this.target=b} function APIClass(b){this.target=b}
APIClass.prototype={xhr:[],send:function(b,c,d){b.hasOwnProperty("path")||c({ModuleError:4});for(var a=0;a<this.xhr.length;a++)4==this.xhr[a].readyState&&(this.xhr=this.xhr.slice(0,a-1).concat(this.xhr.slice(a,this.xhr.length-1)));this.xhr.push(null);a=this.xhr.length-1;this.xhr[a]=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");console.log(b);var f=this;this.xhr[a].onreadystatechange=function(){if(4==f.xhr[a].readyState)if(-1<[0,200].indexOf(f.xhr[a].status))try{c(JSON.parse(f.xhr[a].responseText))}catch(b){c({ModuleError:1})}else c({ModuleError:3})}; APIClass.prototype={xhr:[],send:function(b,d,e){b.hasOwnProperty("path")||d({ModuleError:4});for(var a=0;a<this.xhr.length;a++)4==this.xhr[a].readyState&&(this.xhr=this.xhr.slice(0,a-1).concat(this.xhr.slice(a,this.xhr.length-1)));this.xhr.push(null);a=this.xhr.length-1;this.xhr[a]=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");console.log(b);var c=this;this.xhr[a].onreadystatechange=function(){if(4==c.xhr[a].readyState)if(-1<[0,200].indexOf(c.xhr[a].status))try{d(JSON.parse(c.xhr[a].responseText))}catch(b){d({ModuleError:1})}else d({ModuleError:3})};
var h=new FormData,g;for(g in b)h.append(g,b[g]);this.xhr[a].open("POST",this.target,!0);null!=d&&this.xhr[a].setRequestHeader("Authorization","Digest "+d);this.xhr[a].send(h)}}; var g=new FormData,f;for(f in b)g.append(f,b[f]);this.xhr[a].open("POST",this.target,!0);null!=e&&this.xhr[a].setRequestHeader("Authorization","Digest "+e);this.xhr[a].send(g)}};
function fileUploader(b,c,d){c=new FormData;c.append("filename",filename);c.append("file",b,b.name);var a=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");a.open("POST","manager/import.php",!0);a.onreadystatechange=function(){4==a.readyState&&-1<[0,200].indexOf(a.status)&&(console.log("[1] IMPORT=> "+a.responseText),"success"==a.responseText?API.send({level_0:"excel",level_1:"import_inscrits"},function(a){console.log("[2] PARSE=>"+a.request);"success"==a.request? function fileUploader(b,d,e){var a=new FormData;a.append("prefix",d);a.append("file",b,b.name);var c=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");c.open("POST","/manager/uploader.php",!0);c.onreadystatechange=function(){4==c.readyState&&-1<[0,200].indexOf(c.status)&&e(c.responseText)};c.send(a)};
(requestIntegration={level_0:"groups",level_1:"addUserlist",rang:rang,annee:annee,formationList:a.formationList},API.send(requestIntegration,function(a){console.log("[3] INTEGRATION=>"+a.request);"success"==a.request?(console.log("liste int\u00e9gr\u00e9e"),reload()):(console.log("integration error"),makeBounce(e.target.parentNode))})):(console.log("import error"),makeBounce(e.target.parentNode),console.log(e.target))}):makeBounce(e.target.parentNode))};a.send(c)};

View File

@ -120,51 +120,18 @@ APIClass.prototype = {
function fileUploader(file, prefix, handler){ function fileUploader(file, prefix, handler){
/* [1] IMPORTATION DU FICHIER /* [1] IMPORTATION DU FICHIER
=======================================*/ =======================================*/
var fd = new FormData(); var postdata = new FormData();
fd.append('filename', filename); postdata.append('prefix', prefix);
fd.append('file', file, file.name); postdata.append('file', file, file.name);
var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttpRequest'); var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttpRequest');
xhr.open('POST', 'manager/import.php', true); xhr.open('POST', '/manager/uploader.php', true);
xhr.onreadystatechange = function(){ xhr.onreadystatechange = function(){
if( xhr.readyState == 4 && [0, 200].indexOf(xhr.status) > -1 ){ if( xhr.readyState == 4 && [0, 200].indexOf(xhr.status) > -1 )
handler( xhr.responseText );
};
console.log('[1] IMPORT=> '+xhr.responseText); xhr.send(postdata);
if( xhr.responseText == 'success' ){
/* [2] LECTURE DU FICHIER
=======================================*/
var request = { level_0: 'excel', level_1: 'import_inscrits' };
API.send(request, function(ex){
console.log('[2] PARSE=>'+ex.request);
if( ex.request == 'success' ){
/* [3] INTÉGRATION À LA BDD
=======================================*/
requestIntegration = { level_0: 'groups', level_1: 'addUserlist', rang: rang, annee: annee, formationList: ex.formationList };
API.send( requestIntegration, function(f){
console.log('[3] INTEGRATION=>'+f.request);
if( f.request == 'success' ){
console.log('liste intégrée');
reload();
}else{
console.log('integration error');
makeBounce(e.target.parentNode);
}
});
}else{
console.log('import error');
makeBounce(e.target.parentNode);
console.log( e.target );
}
});
}else makeBounce(e.target.parentNode);
}
}
xhr.send(fd);
} }

View File

@ -337,10 +337,6 @@
$method = $this->modules[$this->path['module']][$this->path['method']]; $method = $this->modules[$this->path['module']][$this->path['method']];
// Si le nombre de parametre en entree est insuffisant
// if( count($method['parameters']) > count($params) ) return false;
/* [2] Si le type est defini, pour chaque param, on teste /* [2] Si le type est defini, pour chaque param, on teste
=========================================================*/ =========================================================*/
@ -348,20 +344,28 @@
/* (1) On récupère si le paramètre est optionnel ou pas */ /* (1) On récupère si le paramètre est optionnel ou pas */
$optional = isset($paramsdata['optional']) && $paramsdata['optional'] === true; $optional = isset($paramsdata['optional']) && $paramsdata['optional'] === true;
/* (2) Si le paramètre est obligatoire et qu'il n'est pas donné -> erreur */ /* (2) Récupère si le paramètre est un fichier et définit comme de type 'FILE' */
if( !isset($params[$name]) && !$optional ) return false; $isFile = isset($paramsdata['type']) && $paramsdata['type'] == 'FILE' && isset($_FILES[$name]);
/* (3) Si le type n'est pas defini, on a pas besoin de le vérifier */ /* (3) Si le paramètre est obligatoire et qu'il n'est pas donné -> erreur */
if( !isset($params[$name]) && !$optional && !$isFile ) return false;
/* (4) Si le type n'est pas defini, on a pas besoin de le vérifier */
if( !isset($paramsdata['type']) ) continue; if( !isset($paramsdata['type']) ) continue;
/* (4) Si le paramètre est optionnel et n'est pas donné */ /* (5) Si le paramètre est optionnel et n'est pas donné */
if( $optional && (!isset($params[$name]) || is_null($params[$name])) ){ if( $isFile || $optional && (!isset($params[$name]) || is_null($params[$name])) ){
// On le crée avec la valeur NULL // On le crée le param optionnel avec la valeur NULL
$params[$name] = null; $params[$name] = null;
// On passe au paramètre suivant
continue;
/* (5) Si le paramètre est renseigné */ // On donne une référence vers le fichier, si c'en est un
if( $isFile )
$params[$name] = &$_FILES[$name];
continue; // On passe au paramètre suivant
/* (6) Si le paramètre est renseigné */
}else }else
// Si la verification est fausse, on retourne faux // Si la verification est fausse, on retourne faux
if( !Database::check($paramsdata['type'], $params[$name]) ) return false; if( !Database::check($paramsdata['type'], $params[$name]) ) return false;

101
manager/module/upload.php Normal file
View File

@ -0,0 +1,101 @@
<?php
namespace manager\module;
use \manager\Database;
use \manager\ResourceDispatcher;
use \manager\sessionManager;
use \manager\ManagerError;
use \manager\Repo;
class upload{
/* EFFECTUE UN UPLOAD D'UN fichier
*
* @prefix<String> Préfixe (dossier parent) du fichier
* @file<FILE> Pointeur vers $_FILES['']
*
* @return error<ManagerError> Retourne l'erreur attestant de l'état de l'upload
*
*/
private static function simpleFile($prefix, $file){
/* [0] On formatte les entrées
=========================================================*/
$prefix = htmlspecialchars($prefix);
// Si $prefix n'est pas au bon format
if( !preg_match('/^[a-z0-9_-]+$/', $prefix) )
return ManagerError::UploadError;
/* [1] Chargement du fichier de config
=========================================================*/
/* (1) On récupère le fichier */
$uploadAuthResource = new ResourceDispatcher('f/json/upload-auth/conf');
/* (2) Si une erreur pour le fichier de conf */
if( $uploadAuthResource->error != ManagerError::Success )
return $uploadAuthResource->error;
/* (3) On récupère la config sous forme de tableau */
$uploadAuth = json_decode( $uploadAuthResource->getContent(), true );
/* (4) Si erreur de PARSAGE */
if( $uploadAuth == null )
return ManagerError::ParsingFailed;
/* [2] Vérification du préfixe
=========================================================*/
// Si le préfixe n'est pas dans la config -> erreur
if( !in_array($prefix, $uploadAuth['directories']) )
returnManagerError::UploadError;
/* [3] Construction du chemin
=========================================================*/
/* (1) On construit le chemin */
$path = __ROOT__.$uploadAuth['root'].'/'.$prefix.'/';
/* (2) On crée le dossier s'il n'existe pas */
if ( !file_exists($path) ) mkdir($path, 0775, true);
/* (3) On construit le nom du fichier */
$fileName = $_SESSION['username'].'.'; // Nom
$fileName .= pathinfo($file['name'], PATHINFO_EXTENSION); // Extension
/* (4) On se place dans le dossier */
chdir( $path );
/* [4] Création du fichier (temporaire->permanent)
=========================================================*/
if( move_uploaded_file($file['tmp_name'], $path.$fileName) ){
// on modifie les droits du fichier
chmod($path.$fileName, 0774);
return ManagerError::Success;
}else
return ManagerError::UploadError;
}
/* IMPORT D'UN JOURNAL D'APPEL
*
* @file<FILE> Pointeur vers $_FILES['']
*
*/
public static function call_log($params){
extract($params);
return array(
'ModuleError' => self::simpleFile('call_log', $file)
);
}
}
?>

View File

@ -13,39 +13,49 @@ use \manager\ManagerError;
exit(); exit();
} }
$prefix = htmlspecialchars(urlencode($_POST['prefix'])); $prefix = htmlspecialchars($_POST['prefix']);
// Si $prefix n'est pas au bon format
if( !preg_match('/^[a-z0-9_-]+$/', $prefix) ){ echo ManagerError::UploadError; exit(); }
/* [1] Chargement du fichier de config /* [1] Chargement du fichier de config
=========================================================*/ =========================================================*/
/* (1) On récupère le fichier */
$uploadAuthResource = new ResourceDispatcher('f/json/upload-auth/conf'); $uploadAuthResource = new ResourceDispatcher('f/json/upload-auth/conf');
// Si une erreur pour le fichier de conf
/* (2) Si une erreur pour le fichier de conf */
if( $uploadAuthResource->error != ManagerError::Success ){ echo $uploadAuthResource->error; exit(); } if( $uploadAuthResource->error != ManagerError::Success ){ echo $uploadAuthResource->error; exit(); }
// On récupère la config /* (3) On récupère la config sous forme de tableau */
$uploadAuth = json_decode( $uploadAuthResource->getContent(), true ); $uploadAuth = json_decode( $uploadAuthResource->getContent(), true );
// Si erreur de PARSAGE /* (4) Si erreur de PARSAGE */
if( $uploadAuth == null ){ echo ManagerError::ParsingFailed; exit(); } if( $uploadAuth == null ){ echo ManagerError::ParsingFailed; exit(); }
var_dump( $uploadAuth ); /* [2] Vérification du préfixe
/* [2] Création du fichier (temporaire->permanent)
=========================================================*/ =========================================================*/
// Si le préfixe n'est pas dans la config -> erreur
if( !in_array($prefix, $uploadAuth['directories']) ){ echo ManagerError::UploadError; exit(); }
/* [3] Gestion de la réponse /* [3] Construction du chemin
=========================================================*/ =========================================================*/
$path = __ROOT__.'/src/dynamic/'.$_POST['prefix'].'/'; /* (1) On construit le chemin */
$fileName = 'test.'; $path = __ROOT__.$uploadAuth['root'].'/'.$_POST['prefix'].'/';
// On récupère l'extension
$fileName .= pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
// on se place dans /src/dynamic/XX /* (2) On crée le dossier s'il n'existe pas */
if ( !file_exists($path) ) mkdir($path, 0777, true);
/* (3) On construit le nom du fichier */
$fileName = $_SESSION['username'].'.'; // Nom
$fileName .= pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); // Extension
/* (4) On se place dans le dossier */
chdir( $path ); chdir( $path );
// chmod( $path, 0774 ); /* [4] Création du fichier (temporaire->permanent)
=========================================================*/
if( move_uploaded_file($_FILES['file']['tmp_name'], $path.$fileName) ){ if( move_uploaded_file($_FILES['file']['tmp_name'], $path.$fileName) ){
// on modifie les droits du fichier // on modifie les droits du fichier
chmod($path.$fileName, 0774); chmod($path.$fileName, 0774);

View File

@ -105,7 +105,7 @@
<!-- Dépendences Javascript après chargement des éléments --> <!-- Dépendences Javascript après chargement des éléments -->
<script type='text/javascript' src='/f/js/action-script/js'></script> <script type='text/javascript' src='/f/js/action-script-min/js'></script>
</body> </body>
</html> </html>