View Full Version : [HTML/JSP] accedere a un file locale sul client senza fare l'upload
Salve, vi espongo il mio problema. Possiamo fare il caso semplice di una pagina HTLM o JSP, per cui ho una pagina web (con sotto classi java se può servire), a cui accede un client. Questp client ha un file, chiamiamolo X, che a me serve. Io da pagina web senza fare nessun upload sul server, devo poter dare un semplice comando su questo file, quindi al massimo l'utente deve irmi dove è posizionato (questo comando serve a separare il file e da esso creare altri 2 file X1 e X2), e poi fare l'upload di X1 e X2 sul server (e per l'upload non ho problemi).
Quello che non sò è come poter dare un comando su un file, dalla pagina web, che si trova in una cartella locale del client, e salvare "l'output" in una cartella temporanea, sempre sul client e poi fare l'upload.
Spero di aver esposto in maniera corretta il problema...Grazie
nuovoUtente86
01-03-2010, 12:28
credo che solo con JS non sia possibile per questioni di sicurezza, ma è possibile farlo con l' utilizzo di ActiveX.
zakmckraken
01-03-2010, 12:52
Ciao!
Solo con ActiveX e servlets, e solo se l'utente permette all'activex/servlet di avere il diritto di accesso al file locale! Addirittura avevo lavorato con delle servlete che si interfacciavano con i drivers TWAIN per accedere direttamente allo scanner installato sul pc client!!
Zak
Per gli activeX non saprei come usarli (mi servono per lo più in ambiente linux), per le servlet è quello che stò usando (portlet e servlet). Ma on riesco a capire come poterlo fare......o meglio, io credevo che nn si potesse proprio fare!! :D
bobbytre
01-03-2010, 13:56
secondo me dovresti creare una applet java che girando completamente in locale ( se i permessi glielo consentono) puo operare sul file , dividerlo e quindi successivamente collegarsi al server remoto per l'upload.
nuovoUtente86
01-03-2010, 14:06
Le servlet agiscono lato server, quindi non hai modo di lavorare in client-side.
E' anche valido il consiglio di operare con le applet.
quindi mi dite che l'unica possibilità è usare un applet?? si accettano consigli a riguardo allora.. :D
no, l'applet non funzionerebbe perché di default le applet non hanno accesso al filesystem locale. prova pure, non ci riuscirai mai senza modificare il file della policy.
comunque a me non sembra tanto strano che non sia possibile accedere al filesystem dell'utente in una web application, fatta eccezione per l'upload di files che avviene con un meccanismo molto controllato (tag <input> di tipo "file" in un tag <form>); mi sembra che ci siano questioni di sicurezza evidenti.
credo che l'unica soluzione sia quella di chiedere fiducia all'utente e di fargli lanciare un programma eseguibile da scaricare dal tuo sito. l'operazione potrebbe essere resa poco pallosa realizzando un programma Java e distribuendolo tramite WebStart (l'utente dovrebbe solo cliccare un link e accettare un certificato).
OT: qualche giorno fa ho programmato per hobby e per necessitá una piccola utility :D
si chiama Password Store e serve a memorizzare dati di login in un file criptato e protetto da password; é utile perché permette di raccogliere in un solo file tutti gli account e passwords che si usano in giro per internet.
non é ancora completa, servirebbero diverse rifiniture qua e lá, peró giá funziona perfettamente.
vi starete chiedendo cosa c'entra :p
c'entra perché la distribuisco tramite Java Web Start e quindi é per farti vedere come verrebbe un programma distribuito in questo modo:
http://wintoys.altervista.org/ps
come dicevo prima, basta cliccare un link e accettare un certificato, autofirmato in questo caso perché francamente non avevo soldi da spenderci :asd:
a titolo informativo, i files generati dal programma vengono criptati facendone lo XOR bit a bit con la sequenza pseudocasuale SHA1 generata usando come seed l'hash SHA-256 della password, quindi c'é una discreta sicurezza.
PS: ok lo ammetto, la sto linkando anche per spammare pubblicitá abusiva :asd:
PPS: credo che prima o poi ne faró un opensource.
bobbytre
02-03-2010, 00:30
se non ricordo male ,
per far accedere una applet al sistema locale , basta semplicemente firmarla, anche con un certificato "fai da te"
all'avvio della applet ti si chiede se ci si fida , e se dai OK , puo agire tranquillamente.
fero86 ho visto l'applicazione :D ottimo....
Cmq se basta far comparire la stessa schermata che ho visto per l'applicazione di fero86, allora siamo a cavallo...posso procurarmi un certificato tranquillamente (o almeno dovrei riuscirci). Ma si può fare questo senza far installare o scaricare nulla all'utente? (nel caso di fero86 ho dovuto scaricare quel picolo file ed eseguirlo)...magari facendo tutto via browser...
ps fero86 mi dai qualche dritta per realizzare una schermata come quella? (poi la classe sotto la faccio io XD).
se non ricordo male ,
per far accedere una applet al sistema locale , basta semplicemente firmarla, anche con un certificato "fai da te"
all'avvio della applet ti si chiede se ci si fida , e se dai OK , puo agire tranquillamente. uhm, in effetti non ci avevo pensato, lo stesso principio delle applicazioni WebStart dovrebbe valere anche per gli applet distribuiti tramite JNLP...
gepeppe, per fare il deploy di un'applicazione o di un applet tramite JNLP devi scrivere un file JNLP, che é un file XML con una certa struttura descritta qui: http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/syntax.html
dalla pagina delle specifiche é possibile scaricare anche il DTD completo e annotato.
il mio file JNLP é fatto cosi:
<?xml version="1.0" encoding="utf-8"?>
<jnlp version="1.1" codebase="http://www.wintoys.altervista.org/ps/">
<information>
<title>Password Store</title>
<vendor>WinToys</vendor>
<homepage href="http://www.wintoys.altervista.org/ps/index.html"/>
<description kind="one-line">Password Store</description>
<description kind="short">A program to store passwords safely in an encrypted password file.</description>
<description kind="tooltip">Password Store</description>
<offline-allowed/>
<shortcut>
<desktop/>
<menu/>
</shortcut>
<association extensions="pws" mime-type="application/pwstore">
<description>Password Store File</description>
</association>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+"/>
<jar href="PasswordStore.jar" main="true"/>
</resources>
<application-desc main-class="com.a71104.password.MainForm"/>
</jnlp>
il file JNLP di un applet sarebbe del tutto analogo tranne il fatto che dovresti usare il tag <applet-desc> anziché <application-desc>. per i tuoi scopi la cosa importante é usare <all-permissions/>. per distribuire un applet tramite JNLP devi dargli un parametro speciale, "jnlp_href" o qualcosa del genere. trovi tutto qua: http://java.sun.com/javase/6/docs/technotes/guides/javaws/developersguide/contents.html
e anche qua: http://java.sun.com/javase/6/docs/technotes/guides/jweb/applet/applet_deployment.html
Allora, ho provato a fare un test semplicissimo, il classico helloword, ma ho sempre un errore. Questo è il file jnpl: http://dl.dropbox.com/u/5143875/HelloWorld.jnlp mentre qui c'è la classe main: http://dl.dropbox.com/u/5143875/Main.jar
Quindi dalla home mi scarico il file .jnpl, (oppure basta liccare sul link che vi ho dato del file) una volta scaricato ci clicco sopra e mi esce questo errore:
com.sun.deploy.net.JARSigningException: Trovata una voce non firmata nella risorsa: http://dl.dropbox.com/u/5143875/Main.jar
at com.sun.javaws.security.SigningInfo.getCommonCodeSignersForJar(SigningInfo.java:382)
at com.sun.javaws.security.SigningInfo.check(SigningInfo.java:256)
at com.sun.javaws.LaunchDownload.checkSignedResourcesHelper(LaunchDownload.java:1384)
at com.sun.javaws.LaunchDownload.checkSignedResources(LaunchDownload.java:1170)
at com.sun.javaws.Launcher.prepareLaunchFile(Launcher.java:1020)
at com.sun.javaws.Launcher.prepareToLaunch(Launcher.java:306)
at com.sun.javaws.Launcher.prepareToLaunch(Launcher.java:183)
at com.sun.javaws.Launcher.launch(Launcher.java:104)
at com.sun.javaws.Main.launchApp(Main.java:403)
at com.sun.javaws.Main.continueInSecureThread(Main.java:250)
at com.sun.javaws.Main$1.run(Main.java:111)
at java.lang.Thread.run(Thread.java:619)
Questo è il file jnpl:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp
codebase="http://dl.dropbox.com/u/5143875/"
href="HelloWorld.jnlp">
<information>
<title>HelloWorld</title>
<vendor>Peppe</vendor>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+"/>
<jar href="Main.jar" main="true"/>
</resources>
<application-desc main-class="helloworld.Main"/>
</jnlp>
e questa la semplice classe:
package helloworld;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Main
{
public static void main(String[] args)
{
JFrame fin = new JFrame("Hello World");
fin.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
fin.setSize(300,300);
Container c = fin.getContentPane();
JPanel pan = new JPanel();
JLabel la = new JLabel ("Hello World");
pan.add (la);
c.add(pan);
fin.setVisible (true);
}
}
forse mi ero spiegato male, il requisito fondamentale affinché l'applet funzioni fuori dalla sandbox é che sia firmato...
EDIT - applet o applicazione che sia
ho firmato il file, ho trovato una guida su come farlo. Ma cmq non funziona...non c'è da qualche parte qualche esempio base??? anche la sola scritta helloword funzionanete basta :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.