Subir archivos desde flex

cancel
Showing results for 
Search instead for 
Did you mean: 
eduandres01_994
Member II

Subir archivos desde flex

Hola a todos!!
Estoy intentando subir archivos a Alfresco desde Flex con el siguiente web script:

<webscript>
  <shortname>upload</shortname>
  <description>Uploads file </description>
  <url>/esoft/upload</url>
  <format default="xml">argument</format>
  <authentication>user</authentication>
  <transaction>required</transaction>
</webscript>

var filename = null;
var content = null;
var mimetype = null;

var name = null;
var title = null;
var description = null;
var author = null;

var nodeid = null;

var storeid = null;
var path = null;

var thumbnailNames = null;


// locate file attributes
for each (field in formdata.fields)
{
   switch (String(field.name).toLowerCase())
   {
      case "title":
         title = field.value;
         break;
      case "desc":
         description = field.value;
         break;
      case "author":
         author = field.value;
         break;
      case "name":
         // for having name propertie different than original filename
         name = field.value;
         break;
      case "file":
         if (field.isFile)
         {
            filename = field.filename;
            content = field.content;
         }
         break;
      case "mimetype":
         mimetype = field.value;
         break;
      case "nodeid": 
         nodeid = field.value;
         break;
      case "storeid":  
         storeid = field.value;
         break;
      case "path": 
         path = field.value;
         break;
      case "thumbnails":
         thumbnailNames = field.value;
         break;        
   } 
}

var isAvmNode = false;

if ((nodeid != null) && (nodeid != ""))
{
   // get folder to upload into using doc mgt nodeid
   model.folder = search.findNode("workspace://SpacesStore/" + nodeid);
}
else if ( (storeid != null) && (storeid != "") && (path != null) && (path != "") )
{
   // get folder to upload into with avm storeid and avm path
   var store = avm.lookupStore(storeid);
   if (store != null)
   {
      var pathWithStore = storeid + ":" + path;
      model.folder = avm.lookupNode(pathWithStore);
      isAvmNode = true;
   }
}
else if ((path != null) && (path != ""))
{
   // get folder to upload into with doc mgt path
   model.folder = roothome.childByNamePath(path);
}

var version = server.version;
var versionNum = parseFloat(version);

// ensure folder and mandatory file attributes have been located
if (model.folder == null || filename == undefined || content == undefined)
{
   status.code = 400;
   status.message = "Uploaded file cannot be located in request";
   status.redirect = true;
}
else
{
   // create document in model.folder for uploaded file
   upload = model.folder.createFile("upload" + model.folder.children.length + "_" + filename);
   upload.properties.content.write(content);
  
   upload.properties.content.mimetype = mimetype;
  
   if (versionNum >= 2.9)
   {
      upload.properties.content.encoding = "UTF-8";
   }
   else
   {
      upload.properties.encoding = "UTF-8";  
   }
  
   if (isAvmNode == false)
   {
      if (name != null)
      {
        upload.properties.name = name;
      }
      else
      {
        upload.properties.name = filename;
      }

      if (title != null)
      {
        upload.properties.title = title;
      }

      if (description != null)
      {
        upload.properties.description = description;
      }

      if (author != null)
      {
        upload.properties.author = author;
      }

      upload.save();
   }
   else
   {
      // need to use rename on avm nodes
      if (name != null)
      {
        upload.rename(name);
      }
      else
      {
        upload.rename(filename);
      }

      // note setting other properties does not work currently
      // with the javascript api on avm nodes

      upload.save();
   }     

  
   if (versionNum >= 3.0)
   {
      if (thumbnailNames != null)
      {
         var thumbnails = thumbnailNames.split(",");
         for (var i = 0; i < thumbnails.length; i++)
         {
            var thumbnailName = thumbnails[i];
            if(thumbnailName != "" && thumbnailService.isThumbnailNameRegistered(thumbnailName))
            {
               upload.createThumbnail(thumbnailName, true);
            }
         }
      }
   }    
   model.upload = upload;
}


<upload>
<server>Alfresco ${server.edition} v${server.version}</server>
<folder>
   <name>${folder.name}</name>
   <id>${folder.id}</id>
   <path>${folder.displayPath}/${folder.name}</path>
</folder>
<node>
   <name>${upload.properties.name}</name>
   <id>${upload.id}</id>
   <path>${upload.displayPath}/${upload.name}</path>
   <title>${upload.properties.title!}</title>
   <description>${upload.properties.description!}</description>
   <#if upload.isDocument>
      <author>${upload.properties.author!}</author>
      <size>${upload.properties.content.size}</size>
   </#if>
</node>
</upload>

El problema es que al tratar de ejecutar el web script desde flex para subir el archivo obtengo el siguiente error:

Error: Execution of web script failed:Failed to execute script '/esoft/upload.post.js (in classpath store file:C:/Alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/templates/webscripts)': Failed to execute script '/esoft/upload.post.js (in classpath store file:C:/Alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/templates/webscripts)': ReferenceError: "formdata" is not defined. (AlfrescoScript#20) URL=http://localhost:8080/alfresco/service/flexspaces/uploadNew
   at org.alfresco.framework.service.webscript::WebScriptService/raiseFailureEvent()[C:\dev\WorkSpace\AlfrescoConFlex\My\org\alfresco\framework\service\webscript\WebScriptService.as:284]
   at org.alfresco.framework.service.webscript::WebScriptService/onResultEvent()[C:\dev\WorkSpace\AlfrescoConFlex\My\org\alfresco\framework\service\webscript\WebScriptService.as:251]
   at flash.events::EventDispatcher/dispatchEventFunction()
   at flash.events::EventDispatcher/dispatchEvent()
   at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:170]
   at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::resultHandler()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:193]
   at mx.rpc::Responder/result()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:43]
   at mx.rpc::AsyncRequest/acknowledge()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:74]
   at DirectHTTPMessageResponder/completeHandler()[E:\dev\3.1.0\frameworks\projects\rpc\src\mx\messaging\channels\DirectHTTPChannel.as:381]
   at flash.events::EventDispatcher/dispatchEventFunction()
   at flash.events::EventDispatcher/dispatchEvent()
   at flash.net::URLLoader/onComplete()

Dice que formdata no esta definido, no se que mas tengo que hacer para que el web script se ejecute bien.
Agradesco sus colaboraciones.
Gracias!! Smiley Very Happy
10 Replies
ajv
Member II

Re: Subir archivos desde flex

Hola eduanddres01!

Creo que el problema está en la forma en que se intenta obtener la información del contenido a subir.
Por algún lado tienes que tener un formulario html donde introduzcas los datos del contenido en cuestión, no??
Para tener acceso al objeto formdata, el form que uses debe emplear enctype="multipart/form-data" dentro del tag del form:
Por ejemplo:
<form action="${url.service}" method="post" enctype="multipart/form-data" accept-charset="utf-8">
       <tr><td>Fichero:<td><input type="file" name="file">
       <tr><td>Titulo:<td><input name="title">
Espero que esto resuelva tu problema.  Smiley Very Happy

Saludos!!
eduandres01_994
Member II

Re: Subir archivos desde flex

ajv gracias por tu respuesta!!!
no se donde tengo que ubicar el formulario htlm, ahora no sale ningun error pero no sucede nada cuando termina de subir.
Si alguien me puede colaborar con eso muchas gracias!!
ajv
Member II

Re: Subir archivos desde flex

Hola eduandres01,

Me alegro que ya no te dé error  Smiley Tongue
Lo que se suele hacer en estos casos es crear 2 web scripts: uno para implementar el método GET, donde estaría el formulario html que recoge la información a subir, y otro para el método POST que recibe la información, realiza la subida de archivo y devuelve un mensaje de estado.
Por el código que mostraste, ya tendrías implementado el post, te faltaba un webscript para el get.

Un par de cosas a tener en cuenta:
- Por simplicidad, llamaría a ambos webscripts de la misma forma, simplemente modificando el método (para uno get y para otro post).
- El formulario, si ambos tienen misma url, debería tener una cabecera similar a la que te puse en el post anterior:
<form action="${url.service}" method="post" enctype="multipart/form-data" accept-charset="utf-8">
El action si te fijas es la url del servicio actual, pues ambos webscripts comparten la url, lo único que los diferencia es el método (que el formulario indica que es post). Además, para que funcione debe tener el enctype="multipart/form-data", así el webscript POST podrá acceder a la información introducida en el formulario mediante el objeto formdata.

Bueno, espero que te haya servido de ayuda.  Smiley Very Happy
Saludos!!
eduandres01_994
Member II

Re: Subir archivos desde flex

ajv muchas gracias por tu respuesta, ahora funciona!!!
Pero de nuevo tengo un inconveniente estoy utilizando otro web script para obtener preview de los documentos almacenados en alfresco y lo que sucede es que a las archivos que estoy subiendo desde flex no los puedo ver en preview
Alguna idea del por que???

Muchas gracias como siempre por tu pronta respuesta!!! Smiley Very Happy
ajv
Member II

Re: Subir archivos desde flex

Hola eduandres01,

Podrías indicarnos qué hace ese otro webscript para hacer el preview?
Es extraño que por el hecho de haberlos subido por el otro web script, ahora no puedan previsualizarse…

Espero noticias.
Saludos!
eduandres01_994
Member II

Re: Subir archivos desde flex

Hola!!!
Lo raro es que si ejecuto el web script desde el navegador, puedo ver el preview luego con el programa que estoy haciendo en flex, igual pongo el web script para obtener el preview
<webscript>
  <shortname>crop Content</shortname>
  <description>gets cropped content as text</description>
<url format="xml" template="/esoft/preview.xml?node={node}"/>
  <format default="xml">extension</format>
  <authentication>user</authentication>
  <transaction>required</transaction>
</webscript>

node = search.findNode(args['node']);
model.node = node;

<#setting locale="en_US">
<#assign c= "">
<#assign i= "#">
<#if node.isDocument>
   <#assign isImage=node.isDocument && (node.mimetype = "image/gif" || node.mimetype = "image/jpeg" || node.mimetype = "image/png")>
   <#if isImage>
      <#assign i =url.context+ node.url+"?"+node.size>
      <#assign i =url.serviceContext+"/api/node/content/"+node.nodeRef.storeRef.protocol+"/"+node.nodeRef.storeRef.identifier+"/"+node.nodeRef.id+"/"+node.name?url>
   <#else>
      <#if node.properties.content??>
      <#assign c= crop(node.properties.content, 1000)>
   </#if>
   </#if>
   
</#if>                   
<dataset>
   <row>
      <content>${c?xml}</content>
      <image>${i}</image>
   </row>
</dataset>

Lo que pienso es que debo tener algo mal en el codigo desde flex, tambien pongo el codigo en flex
try{
               var urlRequest:URLRequest = new URLRequest("http://localhost:8080/alfresco/service/esoft/upload" + "?alf_ticket=" + ticket);
               urlRequest.method = URLRequestMethod.POST;
               
               var params:URLVariables = new URLVariables();
               
               params.title = file.name;
               params.desc = "Contenido de prueba desde flex";
                                        urlRequest.data = params;
            
               file.upload(urlRequest,"file");
                    }catch(err:Error){
               trace("Error cargando archivo" + err.message);
            }

MUchas gracias por la colaboracion!!! Smiley Very Happy
ajv
Member II

Re: Subir archivos desde flex

Hola eduandres,

Desconozco el tema de flex…pero si el web script te va bien en el navegador con Alfresco, debe ser tema de tu integración.
Así mirando el código, la urlRequest estás poniendo una URL que no se corresponde con la del web script del preview…
Tienes puesto: "http://localhost:8080/alfresco/service/esoft/upload" + "?alf_ticket=" + ticket
No deberías tenerlo con la url que marca el fichero descriptor del webscript del preview??  :roll:

Saludos!
eduandres01_994
Member II

Re: Subir archivos desde flex

Hola!!!
El pedazo de codigo que puse antes era para ejecutar el web script para subir el archivo a Alfresco
El que muestra el preview es el siguiente

preview.enabled = false;
               var url:String = "http://localhost:8080/alfresco/service/my/cropContent1.xml?node=" + folders.selectedItem.noderef.toString();
               var webScrip:WebScriptService = new WebScriptService(url,WebScriptService.GET,muestraPreview,null,true);
               var params:Object = new Object();
               params.ticket = ticket;
               var token:AsyncToken = webScrip.execute(params);

Lo que se me ocurre es que debo incluir algo mas en el codigo a la hora de ejecutar el web script que sube el archivo, pero la verdad no se :?
Muchas gracias por la colaboración!!
eduandres01_994
Member II

Re: Subir archivos desde flex

Problema solucionado!!!!
Era capturar el tipo de contenido que queria subir para que Alfresco pudiera reconocerlo como tal y luego asignarle esa propiedad al contenido

upload.properties.content.mimetype = mimetype;

Gracias!!!! Smiley Very Happy