Descripción del protocolo cliente-servidor

El conector - se ejecuta en servidor (PHP, Python). El cliente - se ejecuta en el lado del cliente, en el navegador (JavaScript). Cuando el usuario realiza alguna acción con ficheros el cliente envía una petición al servidor (al conector) y recibe una respuesta. El conector obtiene los datos del cliente mediante GET o POST (sólo cuando sube (upload) / edita (edit) un fichero). El conector siempre responde al cliente con un objeto JSON.

Un parámetro requerido siempre por el conector es cmd -- el nombre del comando, por ejemplo: http://localhost/connector.php?cmd=open

Parámetros comunes, enviados con frecuencia al conector:
  • current : (String) hash de la ruta del directorio actual
  • target : (String) hash de la ruta del fichero sobre el que se realiza la acción
  • targets : (Array) array de hashes de las rutas de los ficheros/directorios sobre los que se realiza la acción
Para cualquier comando la respuesta del conector puede contener los siguientes parámetros:
  • error : (String) un mensaje sobre el error ocurrido
  • errorData : (Object) objeto con mensajes sobre errores no fatales, clave -- nombre del fichero/directorio, valor -- mensaje del error
  • select : (Array) array de hashes de los ficheros/directorios que tienen que aparecer como seleccionados después de ejecuta el comando (upload, mkdir, mkfile, etc)
  • debug : (Object) objeto con la información debug.
Comandos de la parte cliente que no coinciden con los comandos del conector:
  • reload, back - se realiza mediante el comando open
  • list, icons, quicklook, copy, cut - sólo se ejecutan en el cliente y nunca se envían al conector

Cualquier comando, que recibe unos argumentos incorrectos se interrumpe y responde con error (mensaje sobre el error); la excepción a esta regla es el comando open -- devuelve el mensaje de error y el contenido del directorio raíz.

¡Atención! Las rutas hacia los ficheros nunca se envían como texto plano, sólo hash de la ruta (md5 o cualquier otra función que devuelva hash).

Inicialización del gestor de ficheros

Argumentos que se envían del cliente al conector (cliente -> servidor):
  • cmd : open
  • init : true
  • tree : true

Ejemplo: http://localhost:8001/~troex/cgi/connector.py?cmd=open&init=true&tree=true

Respuesta (servidor -> cliente): ver la descripción del comando open, además, la respuesta incluye:

  • disabled : (Array) una lista de comandos deshabilitados
  • params: (Object)
    • dotFiles : (Boolean) ¿permitimos mostrar los ficheros ocultos cuyo nombre empiece por un punto?
    • uplMaxSize : (String) tamaño máximo de ficheros que se pueden subir (por ejemplo: 128M)
    • archives : (Array) Una lista de tipos mime de archivos que pueden ser creados por el conector
    • extract : (Array) Una lista de tipos mime de archivos que pueden ser extraídos por el conector
    • url : (String) URL del directorio raíz del conector

Ejemplo de una respuesta correcta:

JSON:

  1 {
  2     "cwd": {
  3         "name"  : "Home",
  4         "hash"  : "b4473c8c08d1d499ecd7112f3398f125",
  5         "rel"   : "Home",
  6         "date"  : "30 Jan 2010 14:25",
  7         "mime"  : "directory",
  8         "size"  : 0,
  9         "read"  : true,
 10         "write" : true,
 11         "rm"    : false
 12     },
 13     "cdc": [
 14     {
 15         "name"  : "test",
 16         "hash"  : "ac4b61565950a73395c871f9c3fc7362",
 17         "date"  : "Today 14:11",
 18         "mime"  : "directory",
 19         "size"  : 102,
 20         "read"  : true,
 21         "write" : true,
 22         "rm"    : true
 23     },
 24     {
 25         "name"  : "link to README", 
 26         "hash"  : "4fc059e61577f0267fbd6c1c5bafb1b4", 
 27         "url"   : "http://localhost:8001/~troex/git/elfinder/files/wiki/README.txt", 
 28         "date"  : "Today 16:50", 
 29         "mime"  : "text/plain", 
 30         "size"  : 10, 
 31         "read"  : true, 
 32         "write" : true, 
 33         "rm"    : true, 
 34         "link"  : "8d331825ebfbe1ddae14d314bf81a712", 
 35         "linkTo": "Home/README.txt", 
 36         "parent": "b4473c8c08d1d499ecd7112f3398f125" 
 37     }, 
 38     {
 39         "name"  : "logo.png", 
 40         "hash"  : "a696323d7fd86513754004ba8bc12967", 
 41         "url"   : "http://localhost:8001/~troex/git/elfinder/files/wiki/logo.png", 
 42         "date"  : "11 Nov 2009 21:57", 
 43         "mime"  : "image/png", 
 44         "size"  : 18782, 
 45         "read"  : true, 
 46         "write" : true, 
 47         "rm"    : true
 48     }, 
 49     {
 50         "name"  : "README.txt",
 51         "hash"  : "8d331825ebfbe1ddae14d314bf81a712",
 52         "url"   : "http://localhost:8001/~troex/git/elfinder/files/wiki/README.txt",
 53         "date"  : "Today 14:25",
 54         "mime"  : "text/plain",
 55         "size"  : 1171,
 56         "read"  : true,
 57         "write" : true,
 58         "rm"    : true
 59     }
 60     ],
 61     "tree": {
 62         "name"  : "Home",
 63         "hash"  : "b4473c8c08d1d499ecd7112f3398f125",
 64         "read"  : true,
 65         "write" : true,
 66         "dirs"  : [
 67         {
 68             "name"  : "test",
 69             "hash"  : "ac4b61565950a73395c871f9c3fc7362",
 70             "read"  : true,
 71             "write" : true,
 72             "dirs"  : [
 73             {
 74                 "name"  : "test2",
 75                 "hash"  : "b3615611cf9f8f6a8821ef20eda450b5",
 76                 "read"  : true,
 77                 "write" : true,
 78                 "dirs"  : []
 79             }
 80             ]
 81         }
 82         ],
 83     },
 84     "disabled"  : [],
 85     "params"    : {
 86         "url"        : "http://localhost:8001/~troex/git/elfinder/files/wiki",
 87         "dotFiles"   : true,
 88         "uplMaxSize" : "15M",
 89         "extract"    : [
 90             "application/x-7z-compressed",
 91             "application/x-tar",
 92             "application/x-gzip",
 93             "application/x-bzip2",
 94             "application/zip" 
 95         ],
 96         "archives"   : [
 97             "application/x-7z-compressed",
 98             "application/x-tar",
 99             "application/x-gzip",
100             "application/x-bzip2",
101             "application/zip" 
102         ]
103     }
104 }

Lista de comandos

open - abrir el directorio o bien mostrar el fichero en el navegador
mkdir - crear directorio
mkfile - crear un fichero de texto
rename - cambiar el nombre al directorio o fichero
upload - subir ficheros
ping - comando exclusivamente para el navegador Safari (subida de ficheros)
paste - copiar o mover ficheros/directorios al directorio indicado
rm - eliminar directorio/ficheros
duplicate - duplicar directorio/fichero
read - devolver el contenido de un fichero de texto
edit - guardar texto al fichero
extract - extraer archivo
archive - comprimir directorio/ficheros
tmb - crear miniaturas para imagenes que no las tienen
resize - cambiar el tamaño de la imagen

Descripción de comandos

open

Devuelve el contenido del directorio o bien muestra el fichero en el navegador.

1. Abrir directorio

Argumentos:
  • cmd : open
  • target : hash de la ruta al directorio
  • tree : Parámetro no requerido. Si está indicado como true adicionalmente tenemos que incluir en la respuesta el árbol de los directorios.

La respuesta tiene que contener (Object) cwd и array (Array) cdc, adicionalmente puede estar (Object) tree, ejemplo:

 1 {
 2     "cwd" : { // (Object) Current Working Directory - Información sobre el directorio actual
 3         "name"  : "Home",                             // (String)  Nombre del directorio
 4         "hash"  : "b4473c8c08d1d499ecd7112f3398f125", // (String)  hash de la ruta absoluta al directorio
 5         "mime"  : "directory",                        // (String)  siempre "directory" 
 6         "rel"   : "Home",                             // (String)  ruta al directorio actual
 7         "size"  : 0,                                  // (Number)  tamaño del directorio en bytes
 8         "date"  : "30 Jan 2010 14:25",                // (String)  fecha/hora de modificación (mtime)
 9         "read"  : true,                               // (Boolean) ¿podemos leer?
10         "write" : true,                               // (Boolean) ¿podemos escribir?
11         "rm"    : false                               // (Boolean) ¿podemos eliminar?
12     },
13     "cdc" : [ // (Array) (of Objects) Current Directory Content - Información sobre el contenido del directorio actual
14     {
15         "name"  : "link to README",                   // (String)  Nombre del directorio/fichero
16         "hash"  : "4fc059e61577f0267fbd6c1c5bafb1b4", // (String)  hash
17         "url"   : "http://localhost:8001/~troex/git/elfinder/files/wiki/README.txt", // (String) URL
18         "date"  : "Today 16:50",                      // (String)  fecha/hora de modificación (mtime)
19         "mime"  : "text/plain",                       // (String)  tipo MIME del fichero o "directory" 
20         "size"  : 10,                                 // (Number)  tamaño del fichero/directorio en bytes
21         "read"  : true,                               // (Boolean) ¿podemos leer?
22         "write" : true,                               // (Boolean) ¿podemos escribir?
23         "rm"    : true,                               // (Boolean) ¿podemos eliminar?
24         "link"  : "8d331825ebfbe1ddae14d314bf81a712", // (String)  sólo para enlaces, el hash indica la ruta al fichero al que apunta el enlace
25         "linkTo": "Home/README.txt",                  // (String)  sólo para enlaces, la ruta relativa al fichero al que apunta el enlace
26         "parent": "b4473c8c08d1d499ecd7112f3398f125"  // (String)  solo para enlaces, hash del directorio en el que está el fichero apuntado por el enlace
27     },
28     {
29         // ...
30     }
31     ],
32     "tree" : { // (Object) Árbol de directorios. Parámetro no requerido, sólo si se ha indicado mediante el argumento "tree" 
33         "name"  : "Home",                             // (String)  Nombre del directorio
34         "hash"  : "b4473c8c08d1d499ecd7112f3398f125", // (String)  hash
35         "read"  : true,                               // (Boolean) ¿podemos leer?
36         "write" : true,                               // (Boolean) ¿podemos escribir?
37         "dirs"  : [                                   // (Array) (of Objects) array con los directorios que van dentro
38         {
39             "name"  : "test",
40             "hash"  : "ac4b61565950a73395c871f9c3fc7362",
41             "read"  : true,
42             "write" : true,
43             "dirs"  : [
44             {
45                 // ...
46             },
47             {
48                 // ...
49             }
50             ]
51         }
52     }
53 }

¡Atención! Si el argumento target recibido no es el correcto se devuelve el contenido del directorio raíz (cdc, cdw) y un mensaje de error (error).

2. Apertura de fichero (se muestra en el navegador).

Argumentos:
  • cmd : open
  • target : hash de la ruta al fichero
  • current : hash de la ruta al directorio donde se encuentra el fichero

Respuesta:

El fichero se devuelve al navegador con las cabeceras correspondientes.

mkdir

Crear un directorio nuevo.

Argumentos:
  • cmd : mkdir
  • current : hash del directorio en el que se crea el directorio nuevo
  • name : nombre del nuevo directorio

Respuesta: open con el árbol de directorios tree y select - hash del nuevo directorio

 1 {
 2     // open
 3     "cwd"   : {
 4         // ...
 5     },
 6     "cdc"   : [
 7         // ...
 8     ],
 9     "tree"  : {
10         // ...
11     },
12     "select": "ac4b61565950a73395c871f9c3fc7362" // (String) hash del directorio nuevo
13 }

mkfile

Crear nuevo fichero.

Argumentos:
  • cmd : mkfile
  • current : hash del directorio en el que se crea el nuevo fichero
  • name : nombre del nuevo fichero

Respuesta: open y select - hash del nuevo fichero

rename

Cambiar nombre al directorio/fichero

Argumentos:
  • cmd : rename
  • current : hash del directorio donde se encuentra el fichero
  • target : hash del directorio/fichero cuyo nombre queremos cambiar
  • name : nuevo nombre del directorio/fichero

Respuesta: open (si el nombre que cambiamos el de un directorio, entonces también incluimos tree con el árbol de directorios) y select - hash del directorio/fichero con el nombre cambiado.

upload

Subir ficheros

Argumentos (se envían mediante POST):
  • cmd : upload
  • current : hash del directorio al que subimos los ficheros
  • upload : array de los ficheros (upload[])

Respuesta:

1. Si no se ha podido subir ni un fichero lo único que devolvemos es lo siguiente

1 {
2     "error" : "Imposible de subir ficheros" 
3 }

2. Si se ha podido subir al menos un fichero la respuesta es open y select. Si no todos los ficheros han podido ser subidos entonces se mostrarán los mensajes de error error y errorData:

1 {
2     // open
3     "select"    : [ "8d331825ebfbe1ddae14d314bf81a712" ], // (Array)  array con los hashes de los ficheros subidos
4     "error"     : "Algunos ficheros no han podido ser subidos", // (String) si no todos los ficheros han sido subidos
5     "errorData" : {                                       // (Object) información sobre los ficheros que no han podido ser subidos
6         "nombre-fichero.exe" : "Tipo de fichero no permitido" // (String) "nombre del fichero": "error" 
7     }
8 }

ping

Comando para solucionar un bug encontrado en el navegador Safari cuando se suben los ficheros http://www.webmasterworld.com/macintosh_webmaster/3300569.htm

Argumentos:
  • cmd : ping

Respuesta: envía un string vacío con la cabecera Connection: close

paste

Copia o mueve directorios/ficheros

Argumentos:
  • cmd : paste
  • src : hash del directorio desde la que movemos/copiamos ficheros
  • dst : hash del directorio al que movemos/copiamos ficheros
  • targets : array de los hashes de ficheros que se mueven/copian
  • cut : true si movemos los ficheros, false (o bien la ausencia) si los ficheros se copian

Respuesta:
Si los ficheros se han movido/copiado con éxito devuelve open con el árbol de directorios, sino, la respuesta incluye los mensajes de error error y errorData

¡Atención! El comando tiene que detenerse al encontrar el primer error. No se permite la sobreescritura de ficheros/directorios con los mismos nombres.

rm

Eliminación de ficheros/directorios.

Argumentos:
  • cmd : rm
  • current : hash del directorios del que eliminamos ficheros/directorios
  • targets : array de hashes de los ficheros/directorios que eliminamos

Respuesta: open con el árbol de directorios, error y errorData si se ha producido algún error.

duplicate

Crea una copia del directorio/fichero. El nombre de la copia se forma de la siguiente manera: nombre_base copy+número.extensión (si existe)

Argumentos:
  • cmd : duplicate
  • current : hash del directorio en el que creamos el duplicado
  • target : hash del directorio/fichero que duplicamos

Respuesta: open (si se ha copiado un directorio la respuesta incluye el árbol de directorios), select - hash de la ruta del duplicado.

read

Devuelve el contenido de un fichero de texto.

Argumentos:
  • cmd : read
  • current : hash del directorio en el que leemos el fichero
  • target : hash del fichero

Respuesta: content - contenido del fichero de texto.

1 {
2     "content": "Hello world!" // (String) contenido del fichero de texto 
3 }

edit

Guarda el texto en un fichero.

Argumentos (se envían mediante POST):
  • cmd : edit
  • current : hash del directorio en el que se almacena el fichero
  • target : hash del fichero
  • content : nuevo contenido del fichero

Respuesta: file - objeto que describe el fichero idéntico al que se encuentra en la sección cdc del comando open

 1 {
 2     "file" : {
 3         "name"  : "README.txt",
 4         "hash"  : "8d331825ebfbe1ddae14d314bf81a712",
 5         "url"   : "http://localhost:8001/~troex/git/elfinder/files/wiki/README.txt",
 6         "date"  : "Today 14:25",
 7         "mime"  : "text/plain",
 8         "size"  : 1171,
 9         "read"  : true,
10         "write" : true,
11         "rm"    : true
12     }
13 }

extract

Extrae un archivo.

Argumentos:
  • cmd : extract
  • current : hash del directorio en el que se encuentra el fichero
  • target : hash del archivo

Respuesta: open con el árbol de directorios.

archive

Archiva directorios/ficheros.

Argumentos:
  • cmd : archive
  • type : tipo mime del archivo que se pretende crear
  • current : hash del directorio en el que se encuentran los directorios/ficheros que pretendemos comprimir
  • targets : array de hashes de directorios/ficheros

Respuesta: open, select - del archivo creado

tmb

Un comando que se ejecuta en segundo plano. Crea miniaturas para las imágenes que no las tienen. La cantidad de miniaturas que se crearán de golpe se indica en конфиге коннектора con la opción tmbAtOnce. Por defecto - 5.

Argumentos:
  • cmd : tmb
  • current : hash del directorio en el que se crearán las miniaturas

Respuesta:

 1 {
 2     "current": "b4473c8c08d1d499ecd7112f3398f125", // (String) hash de la ruta al directorio donde se crearon las miniaturas
 3     "images" : {                                   // (Object)
 4         "a696323d7fd86513754004ba8bc12967":        // (String) hash de la ruta al fichero
 5             "http://localhost:8001/~troex/git/elfinder/files/.tmb/a696323d7fd86513754004ba8bc12967.png" 
 6                                                    // (String) URL de la miniatura
 7     }, 
 8     "tmb": true  // (Boolean) es true si todavía quedan las imágenes para las que no han sido creadas las miniaturas
 9                  // de lo contrario este parámetros no está
10 }

resize

Cambia el tamaño de una imagen.

Argumentos:
  • cmd : resize
  • current : hash del directorio en el que se encuentra el fichero
  • target : hash de la ruta a la imagen
  • width : nuevo ancho de la imagen
  • height : nuevo alto de la imagen

Respuesta: open, select - hash de la ruta de la imagen

In order for the contextual menu Resize to appear for a given file, its cdc entry must contain both resize and dim. resize must be set to true and dim must be a string containing the file's width and height (eg. "600x400"). If resize is specified without dim the contextual menu will appear, but will not function correctly.

elFinder-init.png (41 kB) Troex Nevelin, 03.02.2010 03:43