Io devo realizzare un'applicazione web che deve offrire l'upload di file tramite browser. Per implementare questa funzionalità ho usato Commons FileUpload, un progetto jakarta. Ho fatto un test con un file txt per vedere se funzionava leggendo l'input stream e stampandolo a video (nel codice questa parte è commentata) e funziona. Se invece prendo l'InputStream lo passo ad un oggetto come variabile membro e chiamo un metodo che fa esattamente la stampa a video dello stream(come provato prima) non riesce.
La servlet che recupera lo stream
Codice PHP:
package controller;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.Reconverter;
import model.Reconverterr;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class for Servlet: ImportXML
*
*/
public class ImportXML extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public ImportXML() {
super();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Reconverterr recon;
Risultato ris = new Risultato(null, null, null);
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart){
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter;
InputStream stream = null;
try {
iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
stream = item.openStream();
/*int ii = stream.available();
for (int i=0; i<ii; i++){
System.out.print((char) stream.read());
}*/
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
test test = new test(stream);
test.testt();
//IL RESTO HA POCA IMPORTANZA
recon = new Reconverterr(stream);
String s = recon.convertiXMLinDB(2);
if (s.equals("ok")){
RequestDispatcher disp =
getServletContext().getRequestDispatcher("/zipok.jsp");
disp.forward(request, response);
}else{
ris.setEsito(s);
ris.setOperazione("Importazione da file zip fallita");
request.setAttribute("risultato", ris);
RequestDispatcher disp =
getServletContext().getRequestDispatcher("/errore.jsp");
disp.forward(request, response);
}
}else{
recon = new Reconverterr(request.getParameter("host"),
request.getParameter("idesame"),
request.getParameter("username"),
request.getParameter("password"));
String s = recon.convertiXMLinDB(1);
if (s.equals("ok")){
RequestDispatcher disp =
getServletContext().getRequestDispatcher("/ftpok.jsp");
disp.forward(request, response);
}else{
ris.setEsito(s);
ris.setOperazione("Importazione da server ftp fallita");
request.setAttribute("risultato", ris);
RequestDispatcher disp =
getServletContext().getRequestDispatcher("/errore.jsp");
disp.forward(request, response);
}
}
}
}
La classe di test è la seguente:
Codice PHP:
package controller;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.fileupload.MultipartStream.ItemInputStream;
public class test {
InputStream s;
public test(InputStream s){
this.s = s;
}
public void testt(){
int lung;
try {
lung = s.available();
System.out.println(lung);
for (int i=0; i<lung; i++){
System.out.print((char) s.read());
System.out.println("for di test");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
In particolare risulta l'intero proveniente da s.available() un numero negativo, anche quando la stampa nella servlet è commentata...
Qualcuno sa spiegarmi come posso risolvere la situazione?
In realtà questo è un caso di test che ho fatto per prova, perché a regime il file da uploadare sarà un file .zip e l'InputStream diventerà uno ZipInputStream e non so quali altre ripercussioni ci potranno essere.
Grazie per l'aiuto...