Foros del Web » Programacin para mayores de 30 ;) » Java »

[SOLUCIONADO] Guardar imagen recibida dropzone

Estas en el tema de Guardar imagen recibida dropzone en el foro de Java en Foros del Web. Hola a todos. Necesito guardar en disco una imagen subida desde el navegador. Lo que estamos utilizando para enviar los ficheros es el plugin dropzone ...
  #1 (permalink)  
Antiguo 09/08/2016, 09:09
 
Fecha de Ingreso: marzo-2008
Mensajes: 94
Antigedad: 16 aos, 1 mes
Puntos: 3
Guardar imagen recibida dropzone

Hola a todos.

Necesito guardar en disco una imagen subida desde el navegador. Lo que estamos utilizando para enviar los ficheros es el plugin dropzone. El plugin se integra y funciona correctamente el problema es cuando en el servidor intento recuperar la imagen para guardarla en disco.

He hecho cosas parecidas sin ningn problema con ficheros en base 64, esto debera de ser parecido pero me estoy rompiendo la cabeza con algo que debo de estar haciendo mal.

Aadimos la imagen y el plugin lanza la peticin post con lo siguiente.

Cita:
-----------------------------298031368414422
Content-Disposition: form-data; name="file"; filename="bronson.jpg"
Content-Type: image/jpeg

�Exif��II*���������V�������^���(� ������1�*���f���2�������i�������� ����
�����������Adobe Photoshop Lightroom 5.7 (Macintosh)�2015:09:10 20:56:08�������0230�����
������2015:08:28 10:01:04��Photoshop 3.0�8BIM���������������8BIM�����,Z� %G���
>�20150828?� 100104-07008BIM
�������8BIM%�����n_6 @WzlýO XICC_PROFILE��� HLino��mntrRGB XYZ �� ��1��acspMSFT��
��IEC sRGB�������������������-HP �����������������������������������������������cp rt��P���3desc
�����lwtpt�����bkpt�����rXYZ�����gXYZ�� ,���bXYZ��@���dmnd��T���pdmdd�����vued ��L
���view�����$lumi�����meas�� ���$tech��0��� rTRC��<�� gTRC��<�� bTRC��<�� text����Copyright
(c) 1998 Hewlett-Packard Company��desc�������sRGB IEC61966-2.1�����������sRGB IEC61966-2.1�������
�������������������������������������������X YZ ������Q����XYZ ����������������XYZ ������o��8�
�XYZ ������b����XYZ ������$ ����desc�������IEC http://www.iec.ch�����������IEC http://www
.iec.ch������������������������������������������� ���desc�������.IEC 61966-2.1 Default RGB colour space
- sRGB�����������.IEC 61966-2.1 Default RGB colour space - sRGB����������������������desc�������,Reference
Viewing Condition in IEC61966-2.1�����������,Reference Viewing Condition in IEC61966-2.1�����������
���������������view������_.��� �\��� XYZ �����L V�P���Wmeas������������������������
����sig ����CRT curv�����������
�����#�(�-�2�7�;�@�E�J�O�T�Y�^�c�h�m�r�w�|��������� ����������������

%+28>ELRY`gnu|  &/8AKT]gqz
� !-8COZfr~ -;HUcq~

+:IXgw'7HYj{ +=Oat 2FZn
  % : O d y

'
=
T
j





" 9 Q i  * C \ u


&
@
Z
t




.Id %A^z &Ca~1Om&Ed #Cc
'Ij*4Vx&Il Ae@e Ek*Qw
;c*R{Gp@j >i  A l !!H!u!!!"'"U"""#

#8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''(
(?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c2
23
3F3334+4e4455M555676r667$7`7788P88 99B999:6:t::;-;k;;<'<e<<="=a==> >`> >
?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEU EEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrL
MMJMMN%NnNO�OIOOP'PqPQQPQQR1R|RSS_SS TBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[
[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=ee f=ffg=ggh?hhiCiijHjjkOkk
lWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!| |}A}~
~b~#G
k͂0WGrׇ;iΉ3d 0cʍ1fΏ6n֑?zM
_ɖ4
uL$h՛BdҞ@ i ءG&vVǥ8nRĩ7u \
*D*-�u`ֲK³8%yhYѹJ ;.!
zpg_XQKFAǿ=ȼ:ɹ8 ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU
\dlvۀ܊ݖޢ)߯6DSc s
2F[p(@Xr4Pm 8Ww)KmLhttp
://ns.adobe.com/xap/1.0/�<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c002 1.148022, 2012/07/15-18:06:45
">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmpRights:Marked="False"
xmpMM:OriginalDocumentID="xmp.did:a225f730-4f81-4002-af9a-a595e5dccc17"
xmpMM:DocumentID="xmp.did:30709a15-6793-4f65-b425-fb36cadc9bb4"
xmpMM:InstanceID="xmp.iid:30709a15-6793-4f65-b425-fb36cadc9bb4"
xmp:CreatorTool="Adobe Photoshop Lightroom 5.7 (Macintosh)"
xmp:CreateDate="2015-08-28T10:01:04-07:00"
xmp:ModifyDate="2015-09-10T20:56:08-07:00"
xmp:MetadataDate="2015-09-10T20:56:08-07:00"
dc:format="image/jpeg">
<xmpMM:DerivedFrom
stRef:instanceID="xmp.iid:bcfc770f-2378-4e16-830f-1b12d73e3bd5"
stRef:documentID="xmp.did:bcfc770f-2378-4e16-830f-1b12d73e3bd5"
stRef:originalDocumentID="xmp.did:a225f730-4f81-4002-af9a-a595e5dccc17"/>
<xmpMM:History>
<rdf:Seq>
<rdf:li
stEvt:action="saved"


... Los datos de la solicitud superan el tamao lmite de Firebug. ...




EFe}D@DDD@DD舀/扢)6;Y|ʴAFMD2r\DlW4M[rܮh orrܮ%
eEDy"r[ܯ哢h>dh<}'D7<}' D7}dh rrܯ rrE^4Ak
>2h)or-rܾ\D7}*Qc{hU"
vR F_t_QE|_Q ESmU"
vYV(ɱhM" \N[+&-rܜW4_PZ7|7]4Ak2 /W_tArrܯ+ VF ~@7
r4A_|}#D7 } }#DH>DK{K{DyMNS{Z2r]4AoɱAoc/V(؛YV)ɵT
)ښ*4_QE|_Q舀 
 
 ?舀
 
 ?舀
 
 
?舀 
 
?
-----------------------------298031368414422--
Esto mismo lo recupero en el servidor pero todo lo que he intentado para guardar la imagen en disco me ha dado como resultado un archivo de imagen daado.


Este es uno de los cdigos que he hecho para esto.

Cdigo:
ByteArrayDataSource ds = new ByteArrayDataSource (request, "multipart/form-data");
					MimeMultipart multipart = new MimeMultipart(ds);
					for (int i = 0; i < multipart.getCount(); i++) {
						BodyPart bodyPart = multipart.getBodyPart(i);

						System.out.println("body1 : " + bodyPart.getFileName());
						System.out.println("body2 : " + bodyPart.getContentType());

						DataHandler handler = bodyPart.getDataHandler();
						System.out.println("handler : " + handler.getName());
						System.out.println("handler : " + handler.getContentType());

						String curContentType = handler.getContentType();

						if (curContentType.equalsIgnoreCase("application/json")) {
							ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
							handler.writeTo(arrayOutputStream);
							System.out.println("projectsJson : " + arrayOutputStream);
						} else {
							OutputStream outputStream = null;
							String ext = "";
							if (curContentType.equalsIgnoreCase("image/gif")) {
								ext = ".gif";
							} else if (curContentType.equalsIgnoreCase("image/jpeg")) {
								ext = ".jpg";
							}else if (curContentType.equalsIgnoreCase("image/png")) {
								ext = ".png";
							} else if (curContentType.equalsIgnoreCase("image/bmp")) {
								ext = ".bmp";
							} else if (curContentType.equalsIgnoreCase("application/pdf")
									|| (curContentType.equalsIgnoreCase("application/x-pdf"))) {
								ext = ".pdf";
							}

							outputStream = new FileOutputStream("/data/maquina/" + handler.getName() + ext);
							handler.writeTo(outputStream);
							outputStream.flush();
							outputStream.close();
						}


He visto que otros plugins pasan las imgenes o ficheros con el mimos formato, me parece que lo que se enva en el post es unicode pero las conversiones que he hecho no han funcionado.

Necesito su ayuda.

Espero su respuesta.

Un saludo.
  #2 (permalink)  
Antiguo 10/08/2016, 05:27
 
Fecha de Ingreso: marzo-2008
Mensajes: 94
Antigedad: 16 aos, 1 mes
Puntos: 3
Respuesta: Guardar imagen recibida dropzone

Hola a todos!!

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

El cdigo 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 mtodo 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 despus devuelvo y con la que creo el nuevo archivo de imagen.

Os dejo el cdigo.

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

Cdigo:
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 extensin*/
						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, "Tamao 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 mtodo string_to_bytes

Cdigo:
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 solucin mas brillante, as que tenis este post para indicarla.

Un saludo a todos!!

Etiquetas: files, jquery, upload
Atencin: Ests leyendo un tema que no tiene actividad desde hace ms de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:31.