Salve,
Sto lavorando ad un progetto in soap che deve inviare un file dal server al client. Io per far questo ho pensato di mandare dal server un DataHandler e di farlo poi riscriverlo.
La funzione del server è molto semplice:
codice:
public DataHandler download(String username, String password,String filename){
//if(!login(username,password)){
// return null;
//}
File file=new File("//var//www//progetto//utenti//"+username+"//"+filename);
DataHandler repositoryItem = new DataHandler(new FileDataSource(file));
return repositoryItem;
}
le linee che ho commentato non sono che una verifica che il file sia preso da un utente registrato. non c'entra..
La funzione non fa altro che prendere un file, metterlo in un DataHandler e restituirlo come valore di ritorno!
Il client invece deve fare la chiamata al soap, quindi è un po' più complesso:
codice:
private void scarica(Object down){ //in down c'è il nome del file
System.out.println("Scarica "+down);//non sembra ma è una stinga
try{
URL url = new URL ("http://localhost:8080/soap/servlet/rpcrouter");
Call call = new Call();
call.setTargetObjectURI(urn:share);
call.setMethodName("download");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
Vector params = new Vector();
params.removeAllElements();
params.addElement(new Parameter("username", String.class, strUsername, null));
params.addElement(new Parameter("password", String.class, strPassword, null));
params.addElement(new Parameter("filename", String.class, down, null));
call.setParams (params);//manda i 3 parametri della chiamata
Response resp = call.invoke(url, "" );//li mette in resp
if ( resp.generatedFault() ) { //controlla se ci sono stati errori
Fault fault = resp.getFault ();
System.out.println("The call failed: ");
System.out.println("Fault Code = " + fault.getFaultCode());
System.out.println("Fault String = " + fault.getFaultString());
}
else {/se va tutto bene
Parameter result = resp.getReturnValue();//mette dentro a Parameter result il DataHandler
FileOutputStream fos = new FileOutputStream(".//"+down);
System.out.println(result.getType()); //DataHandler
//System.out.println(result.toString()); //
Object o = result.getValue();//crea un oggetto con il DataHandler in result
result.writeTo(fos);// dovrebbe scrivere ma non funziona
fos.close();
}
}catch(Exception e){
System.out.println("errore di connessione: "+e);
status.setText("Errore di connessione al server");
return;
}
}
Il problema sta, secondo me, nel prendere il DataHandler nel risultato perchè intrappolato in Parameter.
Qualcuno potrebbe dirmi qualche consiglio?
Grazie in anticipo.