Subir contenido mediante Web service

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

Subir contenido mediante Web service

Hola, he desarrollado un programilla que simplemente es un consumidor de los servicios de Alfresco, lo uso para subir ficheros al repositorio y ejecutar acciones sobre ellos.

El problema viene cuando tengo que importar algún fichero que pase de unos 25 MBytes (según mis pruebas), obtengo el siguiente error:
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultSubcode:
faultString: java.lang.OutOfMemoryError: Java heap space; nested exception is:
   java.lang.OutOfMemoryError: Java heap space
faultActor:
faultNode:
faultDetail:
   {http://xml.apache.org/axis/}hostname:ph28amlde020

java.lang.OutOfMemoryError: Java heap space; nested exception is:
   java.lang.OutOfMemoryError: Java heap space
   at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
   at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
   at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
   at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
   at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
   at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
   at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
   at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
   at javax.xml.parsers.SAXParser.parse(Unknown Source)
   at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
   at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
   at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
   at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
   at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
   at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
   at org.apache.axis.client.Call.invoke(Call.java:2767)
   at org.apache.axis.client.Call.invoke(Call.java:2443)
   at org.apache.axis.client.Call.invoke(Call.java:2366)
   at org.apache.axis.client.Call.invoke(Call.java:1812)
   at org.alfresco.webservice.content.ContentServiceSoapBindingStub.write(ContentServiceSoapBindingStub.java:467)
   at es.yell.anexos.ACPimport.WSImportarDiario.uploadACP(WSImportarDiario.java:153)
   at es.yell.anexos.ACPimport.WSImportarDiario.iniciarImportacion(WSImportarDiario.java:89)
   at es.yell.anexos.ACPimport.WSImportarDiario.main(WSImportarDiario.java:40)
Error subiendo a Alfresco el fichero 2007_09_17.acp:
java.lang.OutOfMemoryError: Java heap space; nested exception is:
   java.lang.OutOfMemoryError: Java heap space

Mi código para subir el fichero:
private Reference uploadACP(String nombreFichero, ParentReference rutaDestinoACPS) throws Exception {
      String rutaFichero = RUTA_ACPS + "/" + nombreFichero;

      rutaDestinoACPS.setChildName("cm:" + nombreFichero);
      NamedValue[] contentProps = new NamedValue[1];
      contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, nombreFichero);
      CMLCreate create = new CMLCreate(String.valueOf(Calendar.getInstance().getTimeInMillis()), rutaDestinoACPS,
            null, null, null, Constants.TYPE_CONTENT, contentProps);

      // Construct CML Block
      CML cml = new CML();
      cml.setCreate(new CMLCreate[] { create });

      UpdateResult[] result;
      Reference content = null;

      try {
         result = WebServiceFactory.getRepositoryService().update(cml);
         content = result[0].getDestination();
      } catch (Exception e) {
         e.printStackTrace();
         throw e;
      }

      ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
      contentService.setTimeout(1000000);

      ContentFormat contentFormat = new ContentFormat(MIMETYPE_ACP, "UTF-8");
      try {
         contentService.write(content, Constants.PROP_CONTENT, Utiles.getBytesFromFile(rutaFichero), contentFormat);
      } catch (Exception e) {
         deleteContent(content);
         e.printStackTrace();
         throw e;
      }
      return content;
   }

Y este es el método Utiles.getBytesFromFile(rutaFichero) que uso para obtener los bytes de un fichero local:
   public static byte[] getBytesFromFile(String filePath) throws IOException {
      File file = new File(filePath);
      InputStream is = new FileInputStream(file);

      // Get the size of the file
      long length = file.length();

      if (length > Integer.MAX_VALUE) {
         // File is too large
      }

      // Create the byte array to hold the data
      byte[] bytes = new byte[(int) length];

      // Read in the bytes
      int offset = 0;
      int numRead = 0;
      while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
         offset += numRead;
      }

      // Ensure all the bytes have been read in
      if (offset < bytes.length) {
         throw new IOException("Could not completely read file " + file.getName());
      }

      // Close the input stream and return bytes
      is.close();
      return bytes;
   }

No sé si hay alguna forma de poder subir ficheros grandes (de entre 30 y 150 MBytes) a través de los web services… Si hubiera alguna manera me ayudaría mucho Smiley Happy

Gracias y hasta pronto!!
8 Replies
pjcaracuel_2349
Active Member II

Re: Subir contenido mediante Web service

Buenas,

En un principio no hay limitacion de tamaño para subir ficheros via webservices, la unica limitacion es la duracion del ticket.
Ahora eso si, atraves de Webdav si funciona.

Aumenta la memoria y prueba a ver que tal.
http://wiki.alfresco.com/wiki/JVM_Tuning

Saludos
agranjo
Member II

Re: Subir contenido mediante Web service

Me auto respondo:

Después de pasar un buen rato por los foros en inglés… he visto que no se puede… hay un límite de tamaño para subir contenidos por web services.

Voy a intentar usar el servlet de upload, he visto que hay un método (ContentUtils.putContent()) que puede subir ficheros a través de este servlet. Por cierto, ¿alguien tiene algún ejemplo de código usando este método?

Un saludo a todos Smiley Happy
pjcaracuel_2349
Active Member II

Re: Subir contenido mediante Web service

Por cierto, me acaban de confirmar que han podido subir ficheros de un maximo de 37 Mb via webservices. Para lo demas Mastercad  :lol:

Saludos
pactorre
Member II

Re: Subir contenido mediante Web service

Hola a todos.
Creo que en este caso se puede decir que existe un límite, pero en cualquier caso este depende de la configuración del servidor, por eso existe cierta variabilidad en cuanto al tamaño máximo de los ficheros que se pueden subir.
agranjo
Member II

Re: Subir contenido mediante Web service

Al final he usado el método que comenté en mi mensaje anterior, ha funcionado a las mil maravillas. He subido ficheros de unos 160 MBytes en un plis. El lunes pego el código para compartirlo (lo tengo en el curro Smiley Happy)
pablopiso
Member II

Re: Subir contenido mediante Web service

Pedro Jiménez, ¿y cómo ha podido subir ficheros de hasta 37 MB con el WS? Yo sólo he podido subir y bajar ficheros de hasta 3 MB y pico. ¿Hay que utilizar alguna opción de configuración o ampliar recursos? ¿O se puede hacer mediante código?

Con el servlet sí se pueden subir más grandes, pero a mi me vale con hasta 30 MB y creo que queda más limpio utilizar el WS que el servlet.

Gracias por anticipado!
pjcaracuel_2349
Active Member II

Re: Subir contenido mediante Web service

Buenas Pablo,

Te comento lo que me dijeron a mi nuestros partner de Alfresco, se podria hacer por codigo, pero la única limitacion que puedes tener a la hora de subir ficheros de "gran tamaño" es la duracion del ticket de la sesion.

Saludos
potele
Member II

Re: Subir contenido mediante Web service

Hola agranjo! ¿Podrías pegar el código que usaste (allá por 2009!) para subir documentos a Alfresco mediante el servlet UploadContentServlet? Estamos teniendo el mismo problema de limitación en tamaño a la hora de subir documentos de algo más de 20 MB. Y no encontramos ejemplos de uso del servlet por ningún lado!

Muchas gracias de antemano,
Jose