Newsgroup: it.comp.java
Titolo: Fare upload di immagini

Salve a tutti,
sono ormai  tre giorni che mi scontro con un problema assai rognoso..
l'upload di immagini. Ora brevemente:
<html>
<head>
<title>Invia un immagine</title>
      <meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<body>
	<form name="formJpegUpload" method="post"
enctype="multipart/form-data" action="memorizzaImmagine.jsp">
		Immagine da inviare:		
  		<input name="jpegFile" type="file" accept="image/jpeg"><br>
		<input name="submit" type="submit" value="Invia immagine">
	</form>
</body>
</html>
--------------
<html>
<head>
<title>Memorizza l'immagine inviata nel database</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<%@ page language="java" import="java.io.*, java.sql.*, org.hsqldb.*" 
%>
<body>
<%
//String contentType = request.getContentType();
int dataSize = request.getContentLength();
InputStream in = request.getInputStream();
byte[] buf = new byte[dataSize];
in.read(buf,0,dataSize);
in.close();
int i=0;
boolean fine=false;
// cerca lo header di una jpeg: ÿØÿà..JFIF
// in byte -1 -40 -1 -32 0 16 74 70 73 70
while ( (i<dataSize) && (fine!=true) ) {
	if ( (buf[i]==-1) && (buf[i+1]==-40) &&
	     (buf[i+2]==-1) && (buf[i+3]==-32) &&
		 (buf[i+4]==0) && (buf[i+5]==16) &&
		 (buf[i+6]==74) && (buf[i+7]==70) &&
		 (buf[i+8]==73) && (buf[i+9]==70) ) {
		fine=true;
		break;
	}
	i++;
}
if ( fine==false )
	response.sendRedirect(response.encodeURL("invioImmagini.htm"));
FileOutputStream fo = new FileOutputStream("pippo.jpeg");
// 157 byte  è la lunghezza in più di dati che vengono aggiunti (in
coda??)
// dall'header http, questi dati come la prima parte dell'header vanno
eliminati
fo.write(buf,i,dataSize-i-157);
fo.close();
/*
RandomAccessFile rf = new RandomAccessFile("pippo.jpeg","rw");
for (int j=i+5; j<dataSize; j++) {
	rf.writeByte(buf[j]);
}
rf.close();
*/
out.println("Finita Scrittura<br><br><br>");
out.println("Data Size= " + dataSize + "<br>");
out.println("Inizio Jpeg= " + (i) + "<br>");
out.println("Valore Byte Inizio Jpeg= " + (buf[i]) + "<br>");
out.println("Lunghezza Jpeg= " + (dataSize-i) + "<br>");
out.println("Lunghezza reale stimata= " + (dataSize-i-157) + "<br>");
%>
</body>
</html>
----------
La pagina html ha un semplice form che invia il file alla seconda che
dovrebbe salvare l'immagine in una cartella del server.
Ora semplicemente l'immagine è salvata solo in parte... non so perchè,
ne riesco a comprenderlo. Filtrando lo header http ho notato che vi
sono sempre altri 157 byte che io presuppongo in coda all file inviato
dal form (anche se così non fosse non credo però sia questo il
problema).
Non cerco coluzioni basate su custom tag o librerie di terzi (O'reilly
per esempio) ma una semplice soluzione in *puro* jsp (non servlet, no
tag) per fare l'upload di jpeg.
La pagina jsp che ho scritto è rozza e soprattutto l'IO può essere
migliorato (bufferizzandolo ad esempio) ma non è questo che cerco per
ora; il problema è che non funziona correttamente, sembra che l'upload
si blocchi sempre dopo circa 8000 byte di dati... non ci capisco un
tubo!
Grazie in anticipo a tutti coloro che volessero darmi una mano.
ciao!
Lorenzo.
PS:
nel caso dovesse servire uso Resin 2.1.6 come http server e container
JSP.

 ora; il problema č che non funziona correttamente, sembra che l'upload


 ciao
Grazie per i siti: sono sempre alla ricerca di risorse interessanti;
in questo caso fortunatamente ho già risolto il problema da me.
Semplicemente supponevo che i dati inviati fossero immediatamente
disponibili
e bastasse leggerli in blocco dopo averne accertate le dimensioni. In
realtà ciò non accade e lo stream di input va letto continuamente sino
a che non ritorna -1. Solo allora la lettura è terminata, poi basta
filtrare gli header ed il gioco è fatto.
ciao