404 messaggi dal 09 maggio 2012
Ciao ragazzi, in una applicazione che sto sviluppando ho esigenza di far caricare agli utenti file di grandi dimensioni e che gli stessi siano accessibili a soli utenti registrati. Pertanto non deve essere possibile accedervi direttamente tramite url ma un determinato file deve essere fruibile solo da determinati utenti registrati. Il login a l'area login esiste già.

Essendo un'applicazione molto grande e complessa oltre che esistente non posso lavorare con la protezione della path che offre di default .net.

Avevo pensato di inserire questi file nel database e restituire il link della risorsa solo a determinati utenti.

Come posso gestire questa funzionalità ? Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Francesco,
cerca di mantenere i file sul disco, sarà più facile da gestire.
Devi solo salvarli in un percorso non direttamente accessibile da web, come per esempio la cartella App_Data oppure una cartella al di fuori della root del sito, purché tu abbia i privilegi di scrittura. Fatti consigliare dagli amministratori che gestiscono il server su cui è ospitata l'applicazione.


Essendo un'applicazione molto grande e complessa oltre che esistente non posso lavorare con la protezione della path che offre di default .net.

Cosa intendi con "protezione della path"?
Se salvi i file in App_Data sfrutti un meccanismo di default che è valido tanto per le piccole che per le grandi applicazioni. In alternativa, potresti salvare i file in una cartella qualsiasi ma rinominandoli con un'estensione "sconosciuta" ad IIS (ovvero non presente tra i suoi mimetypes noti).

Per le grandi applicazioni, effettivamente, potrebbe esserci una difficoltà in più, che è quella di usare uno storage condiviso tra i vari webserver (ammesso che questa applicazione sia servita da vari webserver). Anche in questo caso fatti consigliare dagli amministratori, ma la mia opinione è che i file, specie se molto grossi, vadano tenuti su filesystem. Poi, che tali file si raggiungano da una directory locale o da una share di rete ha meno importanza.

Quando un utente vuole scaricare un file, indirizzalo verso una pagina .aspx (o una action MVC) che si occuperà di autorizzare la richiesta e servire lo stream di bytes al client.

A proposito del caricamento di file di grosse dimensioni, vedi se questa soluzione può fare al caso tuo.
http://forum.aspitalia.com/forum/post/397364/Problema-Upload-File-Grandi-Dimensioni-Api-Youtube-Timeout.aspx#397438

ciao,
Moreno

Enjoy learning and just keep making
404 messaggi dal 09 maggio 2012
Grazie,
supponiamo che i file io voglia salvarli nella cartella App_data. Come faccio ad autorizzarne la scrittura e la lettura ai vari utenti loggati ?
11.886 messaggi dal 09 febbraio 2002
Contributi
Se l'applicazione è ASP.NET WebForms, puoi predisporre un HttpHandler .ashx (che è meglio di una pagina .aspx, dato che non ha lo scopo di produrre markup HTML),

Questo handler effettuerà una connessione al db per verificare che l'utente attualmente connesso abbia il privilegio di caricare un file. Poi:
  • Se si trattava di un tentativo di scrittura, ovvero se il browser aveva invato una richiesta a quell'handler col metodo POST, allora l'handler salverà su disco i dati binari del file inviato via POST;
  • Se si trattava di un tentativo di lettura, ovvero se l'handler era stato richiesto in GET, passando via querystring il nome del file da ottenere (es. download.ashx?file=nome.zip) allora l'handler farà un Response.TransmitFile per inviare il contenuto del file all'utente. Ecco un esempio di Daniele:
    http://www.aspitalia.com/script/944/Inviare-File-Grandi-Dimensioni-HttpHandler-ASP.NET.aspx


Questo handler, dunque, ha lo scopo di regolare l'accesso sia in lettura che in scrittura ai file che si trovano protetti nella cartella App_Data e che perciò sarebbero irraggiungibili in altro modo.

ciao,
Moreno

Enjoy learning and just keep making
404 messaggi dal 09 maggio 2012
Ho qualche problema. Premetto che non ho utilizzato un hendler ma una sub richiamata da un linkbutton. I problemi sono 3:

1) il download del file zip non avviene se in UpdatePanel.
2) la se copio-incollo la path nell url accedo al file e questo non va bene in quanto protetti
3) il file viene scaricato sul desktop. Come posso far decidere all'utente il percorso di salvataggio? Oppure si fa fede alle impostazioni del browser ?
4) se utilizzo un handler non riesco ad accedere al valore di una sessione in quanto mi restituisce "Riferimento a un oggetto non impostato su un'istanza di oggetto"

context.session("valore").ToString()

Modificato da drugomatera il 17 maggio 2016 19.20 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Francesco,


1) il download del file zip non avviene se in UpdatePanel.

E' normale, perché i controlli che fungono da trigger avviano delle richieste ajax e da lì è difficoltoso far scaricare un file all'utente.


e copio-incollo la path nell url accedo al file e questo non va bene

In quale cartella l'hai salvato? Se lo salvi sotto App_Data non sarà raggiungibile da URL (a meno che ovviamente non sia stata modificata questa configurazione di default).


il file viene scaricato sul desktop. Come posso far decidere all'utente il percorso di salvataggio?

Qui è il browser che decide. Nei browser moderni non appare più la finestra di dialogo per la scelta della cartella. I file vengono scaricati nella cartella Download di Windows. A meno che, ovviamente, l'utente non faccia tasto destro -> Salva con nome... sul link che gli metti a disposizione.
Il link ovviamente non potrà essere generato da un LinkButton, ma dovrà essere un semplice link all'handler di cui ti parlavo. Es. <a href="download.ashx?file=nomefile.pdf">Scarica file</a>.


4) se utilizzo un handler non riesco ad accedere al valore di una sessione

Puoi accedere alla sessione se implementi l'interfaccia IReadOnlySessionState, come vedi in questo esempio:
http://www.hanselman.com/blog/GettingSessionStateInHttpHandlersASHXFiles.aspx

ciao,
Moreno

Enjoy learning and just keep making
404 messaggi dal 09 maggio 2012
Si in App_data, ora pare che funzioni però. Ho deciso di utilizzare l'handler ... vorrei capire meglio. L'handler continua a "funzionare" anche se l'utente chiude la scheda che ha generato la richiesta ?
11.886 messaggi dal 09 febbraio 2002
Contributi

L'handler continua a "funzionare" anche se l'utente chiude la scheda che ha generato la richiesta ?

Certo, la richiesta all'HttpHandler è a sé stante ed è indipendente dalla pagina in cui era contenuto il link, che può anche essere chiusa.

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.