Per inviare un file al server (o al client, non c'è differenza) devi semplicemente spedirlo byte per byte. Puoi inviare pacchetti di byte, se vuoi rendere più performante la cosa o, addirittura, inviare un solo pacchetto contenente tutto il file. Quello che non ha senso fare è inviare il path del file nel client: il server non saprà che farsene, dato che non ha accesso alle risorse del client.
Un'altra soluzione prevede l'invio di un URL: ovvero, passi al server l'URL del file nel client, ma questa soluzione non ha molto senso... il client difficilmente farà accedere il server nel proprio hard disk.
Quindi devi prevedere un protocollo tuo di trasmissione. Un esempio potrebbe essere il seguente:
codice:
public class Messaggio {
private byte [] dati;
public Messaggio(byte [] dati) { this.dati = dati; }
public byte[] getDati() { return dati; }
}
Con questa semplicissima classe puoi trasmettere un intero file dal client al server. Vediamo come fa il client:
codice:
public class Client {
...
private void inviaFile(File f) throws Exception {
FileInputStream fis = new FileInputStream( f );
byte [] datiFile = new byte[fis.available()];
fis.read(datiFile);
Messaggio msg = new Messaggio(datiFile);
inviaAlServer( msg );
}
}
Dall'altro capo, il server leggerà in questo modo:
codice:
public class Server {
...
private void riceviMessaggio() {
try {
// ois è nu oggetto di tipo ObjectInputStream
// costruito con l'InputStream della Socket
Messagio msg = (Messaggio) ois.readObject();
recuperaFile( msg );
} catch (Exception e) { e.printStackTace(); }
}
private void recuperaFile(Messaggio msg) {
byte [] datiFile = msg.getDati();
// Ora nell'array datiFile il server ha tutti i byte
// che compongono il file... può fare ciò che vuole.
}
}
Ciao.