Newsgroup: it.comp.www.php
Titolo: nascondere link di download

Sto realizzando un semplice CMS multiutente.
Gli utenti sono divisi in gruppi ("alfa", "beta", "gamma" ecc.); di 
tanto in tanto avrò bisogno di rendere disponibili dei documenti di 
vario formato ai vari utenti; i relativi link compariranno nella home 
page non appena l'utente effettuerà il login.
Il problema è questi file dovranno essere disponibili solo a determinati 
utenti; ovvero i membri del gruppo "alfa" dovranno poter accedere solo 
ai propri e non a quelli del gruppo "beta" o "gamma" e così via.
Non so proprio come approcciarmi al problema.
Stavo pensando al funzionamento di servizi come Megaupload, che 
consentono di scaricare file di grosse dimensioni solo dopo 
l'inserimento di una determinata password, nascondendo la posizione 
reale del file.
Ma non vorrei complicarmi la vita inutilmente. :)
Qualche suggerimento?
m.
-- 
"La legge, in Italia, è come l'onore delle puttane"
(Curzio Malaparte)

 Qualche suggerimento?
Io faccio cosi', ma non e' detto che sia la cosa migliore.
Salvo i file nel file system in una directory non accessibile via http (protetta
da .htacces o similare)
I file non hanno il loro nome vero.
Una tabella mysql contiene il nome vero del file e il nome con cui e' registrato
nel file system
Quando viene linkato un file, viene linkato uno script PHP a cui si passa l'ID
del file nella tabella di cui sopra, tipo <a href='download.php?id=21334'>
Lo script download.php verifica l'ID del file, l'ID dell'utente e, se e' il
caso, legge il file dal file system e lo spara in output.
Se fai cosi', lo script 
download.ph
 prima di mandare il file deve spedire questi
header:
header ("Content-type: $type");  // MIME type
header ("Content-length: $size");   // dimensione in byte del file
header ("Pragma: public");
header ("Content-Description: PHP Generated Data");  // o quel cavolo che vuoi
header ("Content-Disposition: attachment; filename=\"$name\"");  // nome del file
// questi tre header servono per Internet Explorer
// gli header sono tratti dai sorgenti di Squirrel Mail, file functions/mime.php
header ("Cache-Control: no-store, max-age=0, no-cache, must-revalidate"); //
HTTP/1.1
header ("Cache-Control: post-check=0, pre-check=0", false);
header ("Cache-Control: private");
Se chiudi lo script con    ?>    assicurati che non ci siano degli a-capo dopo
la chiusura
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
The world potential market for copying machines is 5000 at most.
       --IBM, 1959

Anch'io faccio così.
Metto un link che mi apre un file un popup download.php?f=id_del_file dove 
faccio un controllo se l'utente è loggato controllando la sessione etc. etc. 
(nel mio caso devo concedere il download solo a utenti loggati e che hanno 
alcune caratteristiche).
e se sono loggato e tutto è OK facio un
  header("Location: 
http://www.miosito.it/download_1.php?f0id_del_file
");
Ora però mi succede una cosa strana.
Nel file download_1.php ho questo:
<?php
...
...
Alcune operazioni
...
...$path 
= $dir_upload ."/". $_GET['f'];
if (file_exists($path)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; 
filename='.basename($nome_file_org));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
ob_clean();
flush();
readfile($path);
exit;
}
?>
Tutto funziona su Firefox, Safari e Opera, e cioè si apre una finestra che 
subito si chiude e parte il download.
Con Explorer 8 invece mi si apre la finestra ma rimane bianca e non succede 
niente.
Se copio il link che ho su questa finestra in una finestra di Explorer che 
apro io e incollo qui il link e invio il download parte.
Idee?!?
Grazie 

 Metto un link che mi apre un file un popup download.php?f=id_del_file dove
A cosa ti serve il popup?
Se metti download.php?id=32232 nel link del href e in download.php non fai altro
output che gli header e il file non serve il popup
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
-rw-rw-rw-   The Permission of the Beast

 ha scritto nel messaggio 
news:i0ap8u$mrj$1...@tdi.cu.mi.it...


 effettivamente il download. Ma come ho detto in Explorer 8 + Vista non va.
Metti tutti i check in uno script unico e ti dimentichi di JavaScript; IMHO e'
piu' semplice e non toglie sicurezza.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
East, West, just points of the compass, each as stupid as the other.
    --Dr. No, "007 Dr. No"

 [...]
Soluzione interessante! :)
Grazie per l'"imbeccata": oggi faccio qualche prova!
m.
-- 
"La legge, in Italia, ï¿œ come l'onore delle puttane"
(Curzio Malaparte)

 Grazie per l'"imbeccata": oggi faccio qualche prova!
Figurati!
Quel sistema funziona benissimo con i file caricati via HTTP/PHP perche' il mime
type ti viene fornito nella variabile $_FILES
Se carichi i file con altri sistemi, devi determinare tu il mime type
(estensione, magic number... scegli tu) altrimenti Explorer fa un po' di casini
e ti mostra l'icona generica.
Sempre per esperienza, l'header "Content-length" non e' fondamentale, ma aiuta
il browser a visualizzare una progress bar attendibile.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Il vs. latino non e' una lingua morta, e' una lingua assassinata!
    --PietroPaolo Bianchi, CHATTER.ITA

 il browser a visualizzare una progress bar attendibile.
Hmmm... ho qualche problema!
Ho copiato il tuo script pari pari, ma ho dei problemi:
non so come indicare il percorso reale del file da scaricare!
ho provato in entrambi i modi, indicando l'url o il path reale in
questo modo:
$name="
http://www.mioserver.com/file.zip
"
$name="/htdocs/wwwroot/filezip"
Ma quando provo a fare il download cambia tutti i ":" e "/" in "-",
ovvero mi va a scaricare "http---www.mioserver.com-file.zip"
che ovviamente è inesistente e quindi risulta "corrotto"
Ho cercato sul web altri esempi ma tutti sono analoghi al tuo, e
non capisco perché faccia la sostituzione di quei caratteri.
Forse salto qualcosa, ma non so cosa... :-\
m.
-- 
"La legge, in Italia, è come l'onore delle puttane"
(Curzio Malaparte)

 Forse salto qualcosa, ma non so cosa... :-\
Trovato!
Indicavo il "content-length" in Kbyte anziché in byte, e di conseguenza
il download si interrompeva anticipatamente, risultando illeggibile.
Almeno così credo.
Cosa strana è che ora che con Firefox la barra di avanzamento resta 
sempre a 0, mentre con Safari arriva alla fine immediatamente, anche
se non ha terminato. Con Explorer non ho provato dato che uso Mac.
In entrambi i casi comunque il download funziona! ;)
grazie ancora


 grazie ancora
Di nulla!
Scusa se non ho risposto prima, ma ero lontano dai newsgroup
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
42: The answer to life, the universe, and everything.

 
Anzi, grazie a te: sei gentilissimo.
Perï¿œ ora la situazione si ï¿œ complicata: come dicevo le prime prove le ho
fatte su Mac e funzionavano. Pure su Linux (Fedora e Ubuntu) tutto ok.
Oggi ho provato da Windows ma, quando clicco sul link di download:
- da Firefox non risponde, continua ad attendere la risposta dal server
- su Explorer il download avviene apparentemente in maniera corretta, ma
il file scaricato risulta invariabilmente corrotto.
Mi sembra un comportamento stranissimo, visto che il download dovrebbe
essere gestito dal server remoto...
Cosa puï¿œ essere?
m.
-- 
"La legge, in Italia, ï¿œ come l'onore delle puttane"
(Curzio Malaparte)