Il fatto che tu stia parlando di FileInputStream e di INPUT TYPE="file" rende automatica una cosa: non hai chiara la differenza fra "risorsa locale al server" (che può essere letta tramite FileInputStream) e "risorsa locale al client".
Un file presente all'interno del disco del server (o all'interno di una cartella di rete raggiungibile dal server) è una rosorsa "locale al server". Lui ci può accedere come fosse un qualsiasi altro file sul proprio file system.
Ciò che risiede sul client (ovvero chi usa il browser per usare la tua webapp) non è raggiungibile in alcun modo dal server. E questo è un punto fondamentale.
Ora, perchè a te funziona da dentro al server? Facile... perchè ti trovi in una posizione decisamente anomala e favorevole: ovvero il client ed il server sono la stessa macchina, quindi un percorso "locale al client" è automaticamente anche un validissimo percorso "locale al server". E questa cosa funziona solo in questa particolare condizione.
Ciò che viene fatto quando c'è un controllo INPUT di tipo File è, grosso modo, questo:
Il browser legge il file dal file system dell'utente
Il browser contatta il server
Il browser spedisce al server lo stream di byte letto precedentemente
Al server, quindi, arriva una richiesta (HttpRequest) di un particolare tipo (non una normale request, ma di tipo multipart/form-data), che va gestita lato server in modo particolare (e, per questo tipo di cose, esistono librerie preconfigurate perchè farlo manualmente su una HttpServletRequest non è così banale). Quindi il server deve leggere il file dalla HttpServletRequest non dal file system (quindi niente FileInputStream, almeno non inizialmente).
Esistono librerie apposite (come la O'Reilly Servlets) che permettono di trattare in modo piuttosto semplice queste cose: si occupano loro di leggere lo stream di byte e di andarlo a scrivere in un file all'interno di una locazione da te prescelta. Così facendo, quello che ottieni dalla lettura del parametro è un oggetto File che effettivamente punta ad un file fisico sul disco del server (che è stato scritto sotto banco per te dalla libreria). A quel punto puoi usare le normali classi per l'InputStream.
Ciao.![]()



Rispondi quotando