Altro problemino riguardante le applet. L'applet che sono andato a sviluppare si collega a una servlet e invia una serie di file i cui nomi stanno dentro a un array di stringhe. La mia idea è di creare una connessione per file mettendo nella URL di richiesta di connessione alla servlet il nome che di volta in volta cambia!
Questo è il codice con cui l'applet si connette alla servlet;
codice:
File file=new File(tex[i]);
try
{
FileInputStream in = new FileInputStream(file);
byte[] buf=new byte[in.available()];
int bytesread = 0;
String nome = nomi[i];
//String nomeURL = URLEncoder.encode(nome,"UTF-8");
String toservlet = "http://localhost:8080/Tesi2/servletupload?n="+nome;
System.out.println(toservlet);
URL servleturl = new URL(toservlet);
URLConnection servletconnection = servleturl.openConnection();
servletconnection.setDoInput(true);
servletconnection.setDoOutput(true);
servletconnection.setUseCaches(false);
servletconnection.setDefaultUseCaches(false);
DataOutputStream out=new DataOutputStream(servletconnection.getOutputStream());
while( (bytesread = in.read( buf )) > -1 ){
out.write( buf, 0, bytesread );
}
out.flush();
out.close();
in.close();
System.out.println("file inviato");
BufferedInputStream inputFromClient = new BufferedInputStream(servletconnection.getInputStream());
inputFromClient.close();
}
catch(Exception e1)
{
e1.printStackTrace();
}
Questo è il codice di ricezione della servlet
codice:
try
{
System.out.println("ENTRATO NELLA SERVLET");
// String fileName = URLDecoder.decode(req.getParameter("nome"),"UTF-8");
String path = ServletGestioneCartelle.getRoot()+(File.separator)+req.getParameter("nome");// se imposto qui il nome del file a mano il trasferimento file funziona
System.out.println(path);
File yourFile = new File(path);
FileOutputStream toFile = new FileOutputStream( yourFile );
DataInputStream fromClient = new DataInputStream( req.getInputStream() );
byte[] buff = new byte[1024];
int cnt = 0;
while( (cnt = fromClient.read( buff )) > -1 ) {
toFile.write( buff, 0, cnt );
}
toFile.flush();
toFile.close();
fromClient.close();
}
catch(Exception e)
{
e.printStackTrace();
}
Il problema è che il parametro nome che metto nella querystring crea un warning nella servlet
codice:
13:29:08,000 WARN [Parameters] Parameters: Character decoding failed. Parameter skipped.
java.io.CharConversionException: isHexDigit
at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:88)
at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:49)
at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:429)
at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:412)
at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:363)
at org.apache.catalina.connector.Request.parseParameters(Request.java:2562)
at org.apache.catalina.connector.Request.getParameter(Request.java:1060)
at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355)
at common.servletupload.doPost(servletupload.java:37)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Apparentemente la servlet riceve il parametro "nome" e crea anche il file, ma il file è di 0 byte.
Il tutto funziona bene se nella servlet imposto a mano il nome del nuovo file. Ho letto in giro che è un problema di codifica dell'URL e quindi ho porvato a fare
String nomeURL = URLEncoder.encode(nome,"UTF-8"); lato applet
String fileName = URLDecoder.decode(req.getParameter("nome","UTF-8"); lato servlet
Sugerimenti?
Oltre alla query string quale sarebbe secondo voi un altro metodo per passare alla servlet il nome del file da creare di volta in volta?
GRAZIE
P.S. sono bene accetti tutti i consigli per migliorare il codice