Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/08/2016, 05:27
smark182
 
Fecha de Ingreso: marzo-2008
Mensajes: 94
Antigüedad: 16 años, 7 meses
Puntos: 3
Respuesta: Guardar imagen recibida dropzone

Hola a todos!!

Nada como hacer que no te importa para probar de nuevo al día siguiente y que te funcione.

El código de arriba lo he desechado, el problema estaba en que al pasar toda la String que contenida la imagen (sin cabeceras) a una array de bytes, java lo hace a su manera cambiando algunos caracteres, entiendo que es por la diferencia de formatos.

Lo he solucionado creando un método al que le paso el contenido de la imagen (sin cabeceras) en el cual paso el contenido de la imagen byte a byte a una array de bytes que después devuelvo y con la que creo el nuevo archivo de imagen.

Os dejo el código.

request es un String con el contenido que llega de dropzone.

Código:
String nombre = null;

					try {

						Log.d(TAG, "Archivo upload recibido");

						String archivo = null;
						int inicio = 0;
						int fin = 0;

						/*Determinmos el inicio del contenido del archivo*/
						if (request.indexOf("image/gif") != -1) {

							inicio = request.indexOf("image/gif") + 13;
							archivo = request.substring(inicio);

							/*Obtenemos el inicio y final del nombre del archivo*/
							inicio = request.indexOf("filename=") + 10;
							fin = request.indexOf(".gif\"") + 4;

						} else if (request.indexOf("image/jpeg") != -1) {

							inicio = request.indexOf("image/jpeg") + 14;
							archivo = request.substring(inicio);

							/*Obtenemos el inicio y final del nombre del archivo*/
							inicio = request.indexOf("filename=") + 10;
							fin = request.indexOf(".jpg\"") + 4;

						} else if (request.indexOf("image/png") != -1) {

							inicio = request.indexOf("image/png") + 13;
							archivo = request.substring(inicio);

							/*Obtenemos el inicio y final del nombre del archivo*/
							inicio = request.indexOf("filename=") + 10;
							fin = request.indexOf(".png\"") + 4;

						} else if (request.indexOf("image/bmp") != -1) {

							inicio = request.indexOf("image/bmp") + 13;
							archivo = request.substring(inicio);

							/*Obtenemos el inicio y final del nombre del archivo*/
							inicio = request.indexOf("filename=") + 10;
							fin = request.indexOf(".bmp\"") + 4;

						} else if (request.indexOf("application/pdf") != -1) {

							inicio = request.indexOf("image/pdf") + 13;
							archivo = request.substring(inicio);

							/*Obtenemos el inicio y final del nombre del archivo*/
							inicio = request.indexOf("filename=") + 10;
							fin = request.indexOf(".pdf\"") + 4;
						}

						/*Obtenemos el nombre del archivo*/
						nombre = request.substring(inicio, fin);

						Log.d(TAG, "Nombre del archivo " + nombre);

						/*Determinmos el final del contenido del archivo*/
						fin = archivo.indexOf("\r\n--------------");
						archivo = archivo.substring(0, fin);

						/*Creamos el nuevo archico con ruta, nombre y extensión*/
						FileOutputStream fos=new FileOutputStream("/data/maquina/" + nombre);

						/*Utilizamos el metodo string_to_byte para recuperar el contenido del archivo con
						* los valores exactos.
						*
						* Igualamos el array de datos al resultado del metodo*/
						byte[] codigos=string_to_bytes(archivo);

						Log.d(TAG, "Tamaño del archivo " + codigos.length + " bytes");

						/*Escribimos el array de datos en el nuevo archovo*/
						fos.write(codigos);

						/*Cerramos el nuevo archivo*/
						fos.close();

						Log.d(TAG, "Archivo " + nombre + " guardado correctamente");

						return "200/"+nombre+"/successful";
					}catch (Exception e){
						return "204/"+nombre+"/successful";
					}
Y este es el método string_to_bytes

Código:
static byte[] string_to_bytes(String cadena)
	{
		int i;
		int tam=cadena.length();
		byte[] octetos = new byte[tam];
		for (i=0; i<tam; ++i) octetos[i] = (byte) cadena.charAt(i);
		return octetos;
	}
Seguro que hay aun solución mas brillante, así que tenéis este post para indicarla.

Un saludo a todos!!