cancel
Showing results for 
Search instead for 
Did you mean: 

Como puedo crear carpetas y archivos en alfresco a través de javascript ?

andersonmercado
Confirmed Champ
Confirmed Champ

Buenos dias.

Gracias a Angel Borroy‌ quien me orientó para agregar un boton a myfiles de alfresco Ejemplo,
pero he intentado crear una carpeta o un archivo a traves del boton y no he podido solucionar
he mirado javascript este ejemplo y no me resulta. Al igual que Doc
pero sigo sin poder crearlo

cualquier ayuda u orientacion me serviria mucho.

// create file, make it versionable
var doc = userhome.createFile('checkmeout.txt');
doc.addAspect('cm:versionable');
doc.content = 'original text';

// check it out and update content on the working copy
var workingCopy = doc.checkout();
workingCopy.content = 'updated text 1';

// check it in
doc = workingCopy.checkin();

// check it out again
workingCopy = doc.checkout();
workingCopy.content = 'updated text 2';

// check it in again, but with a version history note and as major version increment
doc = workingCopy.checkin('a history note', true);

12 REPLIES 12

angelborroy
Community Manager Community Manager
Community Manager

Quizá es la parte que le falta al tutorial: la conexión con el servidor Alfresco mediante Web Scripts o JavaScript de servidor. El principal problema es que ese JavaScript que estás utilizando es de servidor, no de cliente. ¿Dónde lo estás utilizando? ¿En qué fichero?

Hyland Developer Evangelist

en la acción del botón custom-button-myfiles.js pero no me funciona 

angelborroy
Community Manager Community Manager
Community Manager

Veamos si con algo de ayuda puedes continuar el trabajo.

Desde la parte de JavaScript (en la extensión de YUI para el onClick del botón) puedes invocar al repositorio mediante una llamada Ajax a un Web Script del repositorio.

Para realizar la llamada desde Share, utiliza algún ejemplo basado en Alfresco.util.Ajax.request

Para desarrollar el Web Script en repo (contendrá parte de ese código JavaScript que has descrito arriba), puedes consultar Web script controller script | Alfresco Documentation 

En cualquier caso, necesitarás que la lógica de creación de carpeta sea realizada en Repo (alfresco.war) y que el envío de datos y la respuesta sea tratada por Share (share.war). Esto equivaldría a dos proyectos Alfresco SDK (repo y share) o a un proyecto All-In-One con parte de repo y parte de share.

Hyland Developer Evangelist

es decir creo la lógica de carpetas a través del webscript y lo invoco a través  ejemplo basado en Alfresco.util.Ajax.request ?

He seguido desarrollando el ejemplo aquí:

https://github.com/angelborroy/alfresco-add-menu-sample

Espero que te sirva de ayuda. Esta es una de las partes menos documentadas de Alfresco...

Alfresco: Cómo desarrollar la lógica de repositorio asociada al botón

Share es una aplicación web de cliente que no contiene lógica de negocio. Por tanto, si el botón necesita realizar operaciones en el repositorio de Alfresco será necesario desarrollar esa lógica en un proyecto de Repo que sea invocado desde Share a través de una invocación REST.

En esta segunda parte se describen componentes del proyecto de Repo add-menu-dl-repo y una modificación en el proyecto add-menu-dl-share para invocar a la lógica de repositorio.

Desarrollar un Web Script de repositorio

Alfresco dispone de una API de desarrollo de servicios REST denominada Web Script. En este caso vamos a desarrollar un servicio REST que crea un fichero en la carpeta indicada. Por convención, las operaciones de creación en las APIs REST se realizan mediante HTTP POST y por comodidad vamos a realizar el intercambio de información en formato JSON.

Pueden desarrollarse otro tipo de Web Scripts mediante HTTP GET, PUT o DELETE o enviar los parámetros de la URL.

La lógica del Web Script será desarrollada utilizando la API JavaScript de servidor de Alfresco basada en Rhino, aunque podría desarrollarse de manera equivalente utilizando la API Java.

Los Web Scripts suelen constar de:

  • Un XML de descripción y declaración del servicio
  • Un JavaScript o una clase Java de controlador para realizar las operaciones de repositorio requeridas
  • Un FTL de vista para representar el resultado en HTML o JSON

Descripción del Web Script

Creamos el fichero webscripts/keensoft/files/createfile.post.desc.xml en nuestro proyecto de repositorio Alfresco SDK estándar. Es importante que el fichero esté bajo el directorio webscripts y que incluya como extensión el verbo del HTTP (post en este caso) seguido de desc.xml. Las carpetas intermedias keensoft\files son arbitrarias, pueden crearse cualquier otras.

Este fichero define:

<webscript>   
  <shortname>Create file Sample Web Script</shortname>  
  <description>Create sample file at destination</description>  
  <url>/files/create</url>  
  <authentication>user</authentication>  
  <format default="json"></format>
</webscript>

Controlador del Web Script

A continuación definimos la lógica del servicio mediante la API JavaScript de repositorio de Alfresco. Es importante notar que este JavaScript es de servidor y que es por tanto equivalente a la API Java del producto.

Para ello creamos el fichero webscripts/keensoft/files/createfile.post.json.js. Requiere ser creado en la misma carpeta que el descriptor y que la extensión sea el verbo del HTTP (post en este caso) y el formato de los datos en la petición (json en este caso).

La implementación realizada extrae la información del objeto JSON destination que es enviado en la petición (es el NodeRef de una carpeta) y crea un fichero newFile.txt con el contenido original text en esa carpeta. Por último pone la información del fichero creado en el objeto model para que pueda ser utilizada en la vista FTL.

// extract arguments from JSON
var destination = json.get("destination");

// search for folder
var folder = search.findNode(destination);

// create sample file
var doc = folder.createFile("newFile.txt");
doc.content = "original text";

// put information for FTL view
model.doc = doc;

Vista del Web Script

Construimos la respuesta JSON en el fichero webscripts/keensoft/files/createfile.post.json.ftl, que incluye como extensión el verbo HTTP (post en este caso), el formato de la respuesta (json) y el tipo de archivo (ftl).

En esta plantilla FTL (FreeMarker) disponemos de todos los datos que hayamos incluido en el objeto model en el controlador (doc en nuestro caso). A continuación formamos el JSON incluyendo algunos valores del objeto doc.

{     
  "doc": {        
    "nodeRef" : "${doc.nodeRef}",        
    "name" : "${doc.name}"   
  }
}

Una vez realizados estos pasos, deberíamos ser capaces de crear un fichero newFile.txt en la carpeta con NodeRefworkspace://SpacesStore/5418807b-cf50-4f74-85a2-f72bd3daa383 realizando la siguiente petición:

curl -X POST \   
  http://localhost:8080/alfresco/s/files/create \  
  -H
'authorization: Basic YWRtaW46YWRtaW4=' \  
  -H 'content-type: application/json' \  
  -d '{ "destination" : "workspace://SpacesStore/5418807b-cf50-4f74-85a2-f72bd3daa383" }'

El bloque autorización en este ejemplo incluye admin:admin pero es posible que deba ser cambiado en caso de que las credenciales de acceso a Alfresco sean diferentes.

Invocando el Web Script desde Share

Una vez que hemos construido el Web Script y está disponible, podemos realizar la invocación a la API REST desde nuestros componentes YUI de Share utilizando la clase de ayuda Alfresco.util.Ajax.request. En el ejemplo vamos a modificar el fichero custom-button-sharedfiles.js de la carpeta resources/META-INF/sp/modules del proyecto Alfresco Share SDK add-menu-dl-share.

Debajo del alert existente realizamos las siguientes operaciones:

  • Invocación asíncrona con callback de éxito (successCallback) y callback de error (failureCallback)
  • Construcción del JSON de envío en el atributo dataObj
  • Decodificación del JSON de respuesta en la función onRequestSucess
  • Mensajes de información para el usuario mediante la utilidad Alfresco.util.PopupManager.displayMessage
...

// Write your own code
alert("Shared files: " + destination);   

// Invoke async repo Web Script by using HTTP POST and JSON
Alfresco.util.Ajax.request
{    
  method: Alfresco.util.Ajax.POST,    
  url:  Alfresco.constants.PROXY_URI + "/files/create",    
  dataObj:   
  {       
    destination: destination
  },
  requestContentType: Alfresco.util.Ajax.JSON,    
  successCallback:   
  {         
    fn: function onRequestSuccess(response)         
    {             
      var json = Alfresco.util.parseJSON(response.serverResponse.responseText);             
      Alfresco.util.PopupManager.displayMessage(             
      {                 
        text: "File created: " + json.doc.name + " (" + json.doc.nodeRef + ")"
      })         
    },         
    scope: this                      
  },    
  failureCallback:   
  {       
    fn: function onRequestFailure()         
    {             
      Alfresco.util.PopupManager.displayMessage(             
      {                 
        text: "File has not been created!"            
      })          
    },          
    scope: this                   
  } 
});

Una vez realizado este cambio, cuando el botón "Botón" de la barra de herramientas de la Biblioteca de Documentos sea pulsado en la página "Ficheros compartidos", se creará un fichero "newFile.txt" en esa carpeta.

Hyland Developer Evangelist

Hola Angel Borroy‌ yo puedo reemplazar el dataObj por dataForm ? estoy haciendo algo similar estoy usando asprise de prueba el captura la imagen de escaner ya la implementé alfresco pero no se como puedo enviarla al controlador js para crear el archivo y guardarlo en el repositorio.

la verdad no he dado como enviarla 

‌ no entiendo demasiado bien tu problema. Quizá si incluyes algo de código pueda ver cuál es el problema.

Hyland Developer Evangelist

angelborroy
Community Manager Community Manager
Community Manager

‌, ¿te ha sido útil esta información?

Hyland Developer Evangelist

Angel Borroy Buen trabajo

Me ha sido muy útil tu ayuda, gracias por la información 

quiero hacerte otra consulta el webscript el controlador lo hice con java. como puedo recuperar los valores de dataObj 

en el controlador java ? 

las carpetas las estoy creando con FileFolderService.