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:
parent
b94c2fcd05
commit
2556448a9c
|
@ -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" }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"root": "/src/dynamic/",
|
||||
"auth": [
|
||||
"root": "/src/upload/",
|
||||
"directories": [
|
||||
"call_log",
|
||||
"spss",
|
||||
"pspp"
|
||||
|
|
|
@ -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]};
|
||||
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.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()};
|
||||
|
|
|
@ -456,7 +456,7 @@ sociogramClass.prototype.bindings.clickNode = function(thisPtr, e){
|
|||
|
||||
thisPtr.sigma.graph.nodes().forEach(function(n) {
|
||||
if( neighborNodes[n.id] != null ) n.color = n.originalColor;
|
||||
else n.color = '#eee';
|
||||
else n.color = '#888';
|
||||
});
|
||||
|
||||
thisPtr.sigma.refresh();
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
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})};
|
||||
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)}};
|
||||
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?
|
||||
(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)};
|
||||
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 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,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)};
|
||||
|
|
|
@ -120,51 +120,18 @@ APIClass.prototype = {
|
|||
function fileUploader(file, prefix, handler){
|
||||
/* [1] IMPORTATION DU FICHIER
|
||||
=======================================*/
|
||||
var fd = new FormData();
|
||||
fd.append('filename', filename);
|
||||
fd.append('file', file, file.name);
|
||||
var postdata = new FormData();
|
||||
postdata.append('prefix', prefix);
|
||||
postdata.append('file', file, file.name);
|
||||
|
||||
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(){
|
||||
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);
|
||||
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);
|
||||
xhr.send(postdata);
|
||||
}
|
||||
|
|
|
@ -337,10 +337,6 @@
|
|||
|
||||
$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
|
||||
=========================================================*/
|
||||
|
@ -348,20 +344,28 @@
|
|||
/* (1) On récupère si le paramètre est optionnel ou pas */
|
||||
$optional = isset($paramsdata['optional']) && $paramsdata['optional'] === true;
|
||||
|
||||
/* (2) Si le paramètre est obligatoire et qu'il n'est pas donné -> erreur */
|
||||
if( !isset($params[$name]) && !$optional ) return false;
|
||||
/* (2) Récupère si le paramètre est un fichier et définit comme de type 'FILE' */
|
||||
$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;
|
||||
|
||||
/* (4) Si le paramètre est optionnel et n'est pas donné */
|
||||
if( $optional && (!isset($params[$name]) || is_null($params[$name])) ){
|
||||
// On le crée avec la valeur NULL
|
||||
/* (5) Si le paramètre est optionnel et n'est pas donné */
|
||||
if( $isFile || $optional && (!isset($params[$name]) || is_null($params[$name])) ){
|
||||
// On le crée le param optionnel avec la valeur 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
|
||||
// Si la verification est fausse, on retourne faux
|
||||
if( !Database::check($paramsdata['type'], $params[$name]) ) return false;
|
||||
|
|
|
@ -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)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
|
@ -13,39 +13,49 @@ use \manager\ManagerError;
|
|||
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) On récupère le fichier */
|
||||
$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(); }
|
||||
|
||||
// On récupère la config
|
||||
/* (3) On récupère la config sous forme de tableau */
|
||||
$uploadAuth = json_decode( $uploadAuthResource->getContent(), true );
|
||||
|
||||
// Si erreur de PARSAGE
|
||||
/* (4) Si erreur de PARSAGE */
|
||||
if( $uploadAuth == null ){ echo ManagerError::ParsingFailed; exit(); }
|
||||
|
||||
var_dump( $uploadAuth );
|
||||
|
||||
|
||||
/* [2] Création du fichier (temporaire->permanent)
|
||||
/* [2] Vérification du préfixe
|
||||
=========================================================*/
|
||||
// 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'].'/';
|
||||
$fileName = 'test.';
|
||||
// On récupère l'extension
|
||||
$fileName .= pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
|
||||
/* (1) On construit le chemin */
|
||||
$path = __ROOT__.$uploadAuth['root'].'/'.$_POST['prefix'].'/';
|
||||
|
||||
// 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 );
|
||||
// chmod( $path, 0774 );
|
||||
|
||||
/* [4] Création du fichier (temporaire->permanent)
|
||||
=========================================================*/
|
||||
if( move_uploaded_file($_FILES['file']['tmp_name'], $path.$fileName) ){
|
||||
// on modifie les droits du fichier
|
||||
chmod($path.$fileName, 0774);
|
||||
|
|
Loading…
Reference in New Issue