Limitare download file

di il
15 risposte

Limitare download file

Ciao a tutti. Volevo chiedervi come posso fare per limitare il download di un file. Mi spiego meglio: un utente si registra al sito, inserisce il file e il numero massimo di download. Una volta arrivato a questo numero, il download non è più disponibile. Spero che possiate aiutarmi. Grazie in anticipo

15 Risposte

  • Re: Limitare download file

    Ciao tom,
    prova a dare una occhiata qui e vedi se ti può essere utile.... ovviamente lo devi modificare in base alle tue necessità



    Ciao
  • Re: Limitare download file

    Grazie per il link! Adesso faccio dei test e aggiorno.
  • Re: Limitare download file

    Ciao. Purtroppo non riesco a configurarlo. Spiego meglio qual'è l'applicazione. Nel sito (wordpress) c'è un pulsante il quale cliccando sopra si apre l'immagine in una nuova scheda. Io vorrei che al click del pulsante parta in automatico il download. Una volta partito il download va ad aumentare il numero di download nel db. E appena arrivati al numero massimo, viene eliminato il post. Spero puoi aiutarmi. Grazie
  • Re: Limitare download file

    Descrivere il come è semplice:
    • salvi i files al di fuori della webroot dell'applicazione
    • crei una rotta a cui richiedere i files del tipo : webroot/contesto/file?id{fid}
    • nella logica che gestisce la rotta definisci, oltre ai controlli del caso, il download del file e le operazioni che seguono il download (contatore dul db ecc ecc)
    Per scrivere degli snippet di codice che possano esserti utili o indirizzarti sarebbe utile conoscere il tipo di applicazione su cui stai lavorando.
  • Re: Limitare download file

    Limitare il numero di download di un file non e' mai una pratica accettabile A MENO che ogni download non richieda una qualche registrazione CHE DEVE ESSERE mantenuta o ogni copia scaricata non abbia un ID UNIVOCO.

    Se un utente ha il diritto di scaricare un file, questo diritto non viene a mancare se lo scarica una volta o 100.000.

    Perche' un utente scarica piu' volte un file?

    Semplice, perche' lo scarica la prima volta, poi pensa non gli serva e lo cancella, ci ripensa e lo scarica una seconda volta, perde il PC, lo scarica una terza volta, ecc..

    Se deve fare delle copie, ne puo' fare 100.000 dal primo file scaricato.

    Quindi, in generale, non ha molto senso limitare il numero di volte che un file puo' essere scaricato.
  • Re: Limitare download file

    kevin.bravo ha scritto:


    Descrivere il come è semplice:
    • salvi i files al di fuori della webroot dell'applicazione
    • crei una rotta a cui richiedere i files del tipo : webroot/contesto/file?id{fid}
    • nella logica che gestisce la rotta definisci, oltre ai controlli del caso, il download del file e le operazioni che seguono il download (contatore dul db ecc ecc)
    Per scrivere degli snippet di codice che possano esserti utili o indirizzarti sarebbe utile conoscere il tipo di applicazione su cui stai lavorando.
    Grazie per i consigli, credo di aver trovato una soluzione, se risolvo posto il risultato

    migliorabile ha scritto:


    Limitare il numero di download di un file non e' mai una pratica accettabile A MENO che ogni download non richieda una qualche registrazione CHE DEVE ESSERE mantenuta o ogni copia scaricata non abbia un ID UNIVOCO.

    Se un utente ha il diritto di scaricare un file, questo diritto non viene a mancare se lo scarica una volta o 100.000.

    Perche' un utente scarica piu' volte un file?

    Semplice, perche' lo scarica la prima volta, poi pensa non gli serva e lo cancella, ci ripensa e lo scarica una seconda volta, perde il PC, lo scarica una terza volta, ecc..

    Se deve fare delle copie, ne puo' fare 100.000 dal primo file scaricato.

    Quindi, in generale, non ha molto senso limitare il numero di volte che un file puo' essere scaricato.
    Anche io la penso così, è una richiesta particolare del cliente
  • Re: Limitare download file

    Nessuno di vieta di contestare (con la dovuta spiegazione) le richieste del cliente se queste non hanno molto senso.

    Oltre al fatto che risparmiare lavoro e' sempre una cosa buona
  • Re: Limitare download file

    Allora, posto un aggiornamento del lavoro. Questo è il codice del pulsante scarica:
    
    echo '<form method="get" action="http://dominio.com/cartella1/cartella2/cartella3/force-download.php">
    <input type="hidden" name="filename" value="'.$indirizzo.'" />
    <input type="submit" value="Scarica" style="width: 132px;">
    </form>';
    
    e questo il codice di force-download.php
    
    <?php
    $dir = "http://dominio.com/cartella4/cartella5/";
    $fn = (isset($_GET['filename']) ? $_GET['filename'] : false);
    $file = $dir . $fn;
    echo $file;
    if (!file_exists($file))
    {
      echo "Il file non esiste!";
    }else{
      header("Cache-Control: public");
      header("Content-Description: File Transfer");
      header("Content-Disposition: attachment; filename= " . $file);
      header("Content-Transfer-Encoding: binary");
      readfile($file);
    }
    ?>
    force-download.php l ho trovato in rete. Praticamente il problema è che mi restituisce l'errore il file non esiste!, mentre se tolgo il controllo mi scarica un file jpg (quindi formato corretto) che però pesa 0 kb e con un nome che rappresenta l'indirizzo completo del file. Ho testato se effettivamente l'indirizzo viene passato correttamente, facendo echo di $file restituisce l'indirizzo completo del file, che è corretto! Quindi penso che qualche errore sia in force-download.php, non capisco questa istruzione:
    header("Content-Disposition: attachment; filename= " . $file);
    Vi prego aiutatemi sono disperato ci sto perdendo la testa
    P.S.: se volete altre info fatemi sapere
  • Re: Limitare download file

    Ah non ho specificato, nel primo codice postato, $indirizzo rappresenta l'indirizzo parziale del file da scaricare, quindi cartella6/cartella7/file.jpg. Quindi l'indirizzo completo del file da scaricare è http:// dominio.com/cartella4/cartella5/cartella6/cartella7/file.jpg. Ma come dicevo prima, scarica un file che si chiama http___dominio.com_cartella4_cartella5_cartella6_cartella7_file.jpg dal peso di 0 kb. Se provo ad aprirlo mi da errore di compatibilità e windows non riesce a leggerlo.
  • Re: Limitare download file

    Perdonami, ma leggendo rapidamente mi pare che tu non abbia la minima idea di quanto stai facendo.
    come primissima cosa devi convertire il percorso passato da PHP (il GET per capirci) con il percorso del file fisico all'interno del server.
    Hai DUE casi.
    Caso "normale", che può variare a seconda che sia Windows o Linux.
    Se GET chiede "pippo.jpg", dentro lo script PHP per lo scaricamento devi convertirlo, ad esempio, in "/home/ilmioarchivio/pippo.jpg", oppure "c:\ilmioarchivio\pippo.jpg" (ovviamente i percorsi devono essere quelli giusti!).

    Primo passo: manipola GET fino a quando non riesci a far stampare a video il percorso corretto, poi si fa il resto
    (altre elaborazioni, in particolare per ritornare il file, ma anche incrementare il contatore).
    Qualcosa del genere
    
    	header("Pragma: public");
    	header("Expires: 0");
    	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    	header("Cache-Control: public");
    	header("Content-Description: File Transfer");
    	header("Content-Type: $mtype");
    	header("Content-Disposition: attachment; filename=\"$sticaname\"");
    	header("Content-Transfer-Encoding: binary");
    	header("Content-Length: " . $fsize);
    
    	$file = @fopen($file_path,"rb");
    	if ($file) 
    	{
    		while(!feof($file)) 
    		{
    			print(fread($file, 1024*8));
    			flush();
    			if (connection_status()!=0) 
    			{
    				@fclose($file);
    				die();
    			}
    		}
    		@fclose($file);
    	}
    	
    	$f = @fopen(LOG_FILE, 'a+');
    	if ($f) 
    	{
    		@fputs($f, date("Y.m.d g:ia")."  ".$_SERVER['REMOTE_ADDR']."  ".$chiave." ".$fname."\n");
    		@fclose($f);
    	}
    
    Caso "semplificato", cioè ti limiti a creare la stringa che poi farai tornare al browser.
    In questo caso dovrai "manipolare" GET fino a quando non riesci a far stampare a video
    http://ilmiobelsito.com/chebelchebel/pippo.jp (cioè URL GIUSTO!)
    poi si fa il resto.
  • Re: Limitare download file

    migliorabile ha scritto:


    Nessuno di vieta di contestare (con la dovuta spiegazione) le richieste del cliente se queste non hanno molto senso.

    Oltre al fatto che risparmiare lavoro e' sempre una cosa buona
    Capita tutti i giorni di limitare il numero di download di un file.
    Spesso anche in modo stringente (es. 3)
  • Re: Limitare download file

    +m2+ ha scritto:


    Primo passo: manipola GET fino a quando non riesci a far stampare a video il percorso corretto, poi si fa il resto
    (altre elaborazioni, in particolare per ritornare il file, ma anche incrementare il contatore).

    Caso "semplificato", cioè ti limiti a creare la stringa che poi farai tornare al browser.
    In questo caso dovrai "manipolare" GET fino a quando non riesci a far stampare a video
    http://ilmiobelsito.com/chebelchebel/pippo.jp (cioè URL GIUSTO!)
    poi si fa il resto.
    e questo riesco a farlo, a video vedo il percorso completo (e corretto) insieme all'errore il file non esiste. Potresti spiegarti meglio per favore?
  • Re: Limitare download file

    Pensavo di averlo spiegato bene, comunque hai DUE percorsi
    1) il percorso del file nel filesystem del server
    2) URL che viene decodificato da http

    Se il file si chiama "pippo.jpg", e tu vuoi usare QUESTO
    !file_exists($file))
    bisogna che dentro $file ci metti il percorso del FILESYSTEM del server. Ad esempio "c:\ilmioarchivio\pippo.jpg"

    2) il percorso con l'URL (es. http://www.ilmiosito.it/boh/nonso/pippo.jp") NON HA NULLA a che fare con
    file_exists

    Se dal GET allo script PHP ti arriva una variabile "pippo.jpg", dovrai fare DUE cose
    1) costruire la stringa "c:\ilmioarchivio\pippo.jpg"
    A quel punto potrai usare file_exists su QUELLA stringa
    2a) se il controllo è positivo, ALLORA genererai la seconda stringa
    http://www.ilmiosito.it/boh/nonso/pippo.jp e farai scaricare al browser il file
    2b) OPPURE farai un programmello PHP un filo più complesso per togliere il timeout, aprire il file e ritornarlo "manualmente" al browser (ti ho messo uno snippet pezzo di un mio programma, va adattato)

    Spero che ti sia più chiaro che puoi fare
    1+2a
    oppure
    1+2b

    2b meno "immediato" ma più flessibile (cioè puoi controllare meglio cosa accade durante la fase di preparazione, ad esempio potresti zippare il file e ritornare lo zip con dentro il file medesimo eccetera)
  • Re: Limitare download file

    Perdonami, ma credo di essermi perso. Nel mio file io ottengo dal GET una parte del percorso, che poi unisco con il percorso globale che è con http. Quindi :
    
    $dir = "http://dominio.com/cartella4/cartella5/";
    $fn = (isset($_GET['filename']) ? $_GET['filename'] : false);
    $file = $dir . $fn;
    dove $dir è il percorso globale (sempre lo stesso), $fn è quello secondario (può variare), mentre $file è quello completo. Quindi se ho capito bene dovrei convertire il percorso completo http nel percorso completo del filesystem del server? Non saprei come fare in questo caso...
    Perdonami ma sono un neofita
Devi accedere o registrarti per scrivere nel forum
15 risposte