Estoy subiendo imágenes al servidor. La imagen se la envío en un input file a mi servidor local, la convierto en un arreglo de bytes, seteo el arreglo en un una clase modelo (BasicFileAction) y luego con un objeto de tipo URL hago una conexión hacia un servicio en un servidor donde guardaré la imagen y le envío como parámetro el objeto de tipo BasicFileAction y ya se guarda.
El problema está en que cuando cargo una imagen de más de 3.68MB la imagen no se sube y no me lanza ningun mensaje de error, no entra al catch ni nada parecido. Parece que truena en
ObjectOutputStream.writeObject(objaBasicFileAction);
Intenté subiendo muchas imágenes, y TODA imagen menor a 3.68MB sí la sube; probé con imágenes mayores a 3.81MB y ya no las sube. Imágenes entre 3.68MB y 3.81MB no pude obtener, por lo que no sé cuál es exactamente el tamaño que sí sube y el que, apartir de él, no.
Mi clase Modelo:
package com.mypackage.actions;
import java.io.Serializable;
public abstract class BasicFileAction implements Serializable{
private int[] objcFileBytes;
private String scFileName;
public int[] getFileBytes(){
return objcFileBytes;
}
public void setFileBytes( int[] objaFileBytes ){
objcFileBytes = objaFileBytes;
}
public String getFileName(){
return scFileName;
}
public void setFileName(String saFileName){
scFileName = saFileName ;
}
public abstract Object execute() throws Exception;
}
Esta es el método que hace el request:
public Object executeService(BasicFileAction objaBasicFileAction)
throws Exception {
URL objlURLServer = null;
ObjectInputStream objlResponse = null;
Object objlObjectResult = null;
URLConnection objlURLConnection = null;
ObjectOutputStream objlRequest = null;
TunnelException exclTunnelException = null;
try {
objlURLServer = new URL((String) objcProperties.get(
FileRemoteHandler.SERVICE_NAME));
} catch (MalformedURLException e) {
throw new Exception(
"No se puede efectuar la conexion al servidor de fotografias '" +
(String) objcProperties.get(FileRemoteHandler.SERVICE_NAME) +
"' : " + e.getMessage());
}
try {
objlURLConnection = objlURLServer.openConnection();
objlURLConnection.setDoOutput(true);
objlURLConnection.setUseCaches(false);
objlURLConnection.setRequestProperty("Content-Type",
"application/octet-stream");
System.out.println("terminando1");
objlRequest = new ObjectOutputStream(new BufferedOutputStream(
objlURLConnection.getOutputStream()));
try{
objlRequest.writeObject(objaBasicFileAction); //De aquí no pasa con las imágenes mayores a 3.68MB
objlRequest.flush();
objlRequest.close();
}catch(NotSerializableException r){
System.out.println("1 "+r.getMessage());
} catch(InvalidClassException t){
System.out.println("2 "+t.getMessage());
} catch(IOException w){
System.out.println("3 "+w.getMessage());
}
// get the result input stream
objlResponse = new ObjectInputStream(new BufferedInputStream(
objlURLConnection.getInputStream()));
// read response back from the server
objlObjectResult = objlResponse.readObject();
if (objlObjectResult instanceof TunnelException) {
exclTunnelException = (TunnelException) objlObjectResult;
throw new Exception(exclTunnelException.getMessage());
}
} catch (Exception exclException) {
System.out.println("here: "+exclException.getMessage());
throw new Exception("Error al Ejecutar la Peticion : " +
exclException.getMessage());
}
return objlObjectResult;
}
Adicionalmente les dejo información de los arreglos de bytes de las diferentes peticiones que hice.
Las que sí se subieron, el tamaño del arreglo está entre paréntesis:
3.68MB (3867314)
3.19MB (3355578)
3.05MB (3204054)
Las que no se subieron:
4.09MB (4293306)
4.36MB (4572533)
3.81MB (3997079)
He revisado el código en el servidor de imágenes, es un servlet. Puse un System.out.println al inicio del servlet para ver si se llegaba a ejecutar el servlet y pues me he dado cuenta que no. No pasa del writeObject pero tampoco llega al servlet.
Alguna idea?
EDIT: He actualizado la manera en la que envío los datos. Imaginando que el arreglo que le enviaba era demasiado grande lo partí en dos. Ahora la clase BasicFileAction tiene un parámetro más: la segunda parte del arreglo. He programado todo para que writeObject reciba un objeto de tipo BasicFileAction, el cuál, como dije antes, tiene un arreglo más que es el la segunda mitad del arreglo de bytes de la imagen. Probé el código y funciona correctamente DE IGUAL FORMA con imágenes que pesan 3.68MB o menos. De igual manera no pasa de ObjectOutputStream.writeObject(objaBasicFileAction); Y en el servidor de imágenes no imprime nada pues no se ejecuta ni la primera línea del servlet.
Con lo que he hecho me he dado cuenta que el problema es la cantidad de información que se le manda al writeObject de java.io.ObjectOutputStream, aunque le pase el arreglo de bytes en muchos arreglos de tamaños menores va a seguir tronando.
¿Qué pasa con writeObject? ¿Es demasiado grande la información que no la puede enviar? ¿Hay alguna manera diferente de enviarle las imágenes?