Scaricare file in php

Avrei una mezza idea di realizzare un file manager per il mio sito.

Vorrei potermi collegare ad esso anche da un PC senza un client FTP installato (cosa che mi capita spesso) e potere ugualmente caricare, scaricare, visualizzare, rinominare, creare e cancellare file e directory.

Do un'occhiata subito alle funzioni di filesystem e directory sul manuale, mi sembra che ci sia tutto, sempre sul manuale (e non solo) trovo ampie e dettagliate spiegazioni su come effettuare il caricamento dei file con il metodo POST...ad un certo punto mi domando:

per scaricare un file (o più) dallo spazio remoto al mio PC tramite uno script PHP presente sullo spazio remoto come dovrei procedere?

Ora come ora, sarà l'ora tarda, non avrei proprio idea di come fare...mah  ::)

Grazie  :bye:

inviato 7 anni fa
usecram
X 0 X

E' semplice, basta un link diretto al file; però fai attenzione:

* se si tratta di pagine html o immagini vengono aperte direttamente dal browser (click destro salva con nome);

* se si tratta di pagine php vengono processate dal server e non riesci;

* per tutti i file che il browser non gestisce direttamente in automatico ti chiede di salvare se non c'è un programma associato.

Il modo migliore sarebbe quello di passare il file ad un'altra pagina in php che invia il file aggiungendo le intestazioni per dire al browser che è un attachment, in questo modo è un o' più complesso ma con un po' di lavoro si fa ed è il metodo migliore.

risposto 7 anni fa
LonelyWolf
X 0 X

Grazie LonelyWolf effettivamente avevo fatto una ricerca su questo forum ed avevo esaminato uno scriptino che faceva il download proprio puntando direttamente al file, ma, per i motivi che hai detto, come metodo non mi aveva soddisfatto affatto.

Riguardo all'altra soluzione invece ti sarei molto grato se potessi darmi maggiori ragguagli teorico-pratici:

  • Come funziona?
  • Consente di scaricare più di un file? Magari una cartella intera con il suo contenuto?
  • Ha dei limiti?Quali?
  • Potresti postarmi del codice dal quale prendere spunto?

Mille grazie!

 :bye:

risposto 7 anni fa
usecram
X 0 X

* In sostanza nelle intestazioni che vengono inviate al browser gli si dice che è un "allegato" e che non deve aprirlo, il browser fa comparire la classica finestrella per il salvataggio.

* Si scarica solo un file alla volta, se proprio ti ci vuoi mettere fai un ciclo che "invia" i file uno dopo l'altro.

* Non credo abbia dei limiti il metodo in se.

* Per postarti del codice abbi un p' di pazienza e ti farò avere qualche cosa!

risposto 7 anni fa
LonelyWolf
X 0 X

Attenderò fiducioso  :coolsmiley:

risposto 7 anni fa
usecram
X 0 X

Ecco qualche esempio semplice da cui puoi partire:

    <?
    header("Content-Type: octet/stream");
    header("Content-Length: ".filesize("file.txt"));
    header("Content-Disposition: attachment; filename=file.txt");
    include("file.txt");
    ?>
    <?
    $url= "/home/web/reserved/files/";
    $id_file= "nome_file.ext";
    $total=$url.$id_file;
    header("Pragma: no-cache");
    header("Expires: 0");
    Header("Content-Type: application/octet-stream");
    Header("Content-Length: ".filesize($total));
    Header("Content-Disposition: attachment; filename=$nome_file");
    readfile($total);
    ?>

Tieni presente che se il nome del file contiene degli spazi devi sostituirli con %20, es:

prova download.php

nell'indirizzo deve diventare:

prova%20download.php

Se hai qualche altro problema basta chiedere!

risposto 7 anni fa
LonelyWolf
X 0 X

Dunque dunque dunque...direi proprio che funziona alla grandissima, è compatibile con tutti i browser e ottengo quello che volevo in 10 righe di codice. Che dire mille grazie!

Ho fatto qualche ricerca per sapere cosa accidenti significasse:

header("Content-Type: application/octet-stream");

Ho trovato un paio di link:

http://www.giorgiotave.it/guida_php/download_file.php

ma soprattutto

http://forum.html.it/forum/showthread.php?s=&threadid=530272&perpage=15&highlight=&pagenumber=1

che mi hanno chiarito le idee.

Se a qualcuno interessa legga pure.

Sono già soddisfatto della risposta ma vorrei sapere se esiste anche un metodo per scaricare una cartella con il suo contenuto.

 :bye:

risposto 7 anni fa
usecram
X 0 X

Come ti ho scritto precedentemente, non è possibile nemmeno in ftp, vengono inviati i file uno dopo l'altro, puoi farti il codice tu eccoti la logica:

ricevo il nome del file da dover scaricare

test:

se è una cartella entra e scorri tutti i file (consiglio una inclusione di codice esterno per renderlo + leggibile)

se è un file invia direttamente al browser

risposto 7 anni fa
LonelyWolf
X 0 X

Uhm...domandina: ma se faccio un ciclo che mi legge tutti i file di una cartella non mi si apriranno tante finestrelle per il download quanti sono i file da scaricare?  :buck:

La logica la condivido ma è questo quello che volevo evitare.

risposto 7 anni fa
usecram
X 0 X

Scusa il ritardo ma ieri finivo alle 14:oo! :D

se il ciclo non ha "attesa" si, le invia tutte, ma il browser di solito limita il numero dei downloads contemporanei.

Poi dipende anche da cosa sta scaricando se sono file di pochi Kb come pagine html/php ci vuole pochissimo a scaricarli, se sono grossi il discorso cambia.

Potresti fare il ciclo che invece di inviare immediatamente tutto genera l'array con gli url di tutti i file e poi li invia con un tempo di attesa prestabilito in base alle dimensioni del file.

Se hai le estensioni zip disponibili potresti compattarli in un file temporaneo, inviarlo e poi cancellarlo (in teoria anche inviarlo man mano che lo crea); ma su questo non saprei aiutarti.

risposto 7 anni fa
LonelyWolf
X 0 X

Sai ieri avevo pensato che nel caso che il download fosse più d'uno mi convenisse compattare il tutto in un file zip e scaricarlo.

Potrei scaricare in un sol colpo una cartella intera e ben oltre.

Mi sono messo all'opera per cercare una classe che facesse al mio caso, ho impiegato un po' di tempo  ma alla fine mi sono imbattuto in un articolo che sembra proprio fare al caso mio.

Non ho ancora finito di leggerlo ma promette bene, se interessa...

http://www.phpit.net/article/creating-zip-tar-archives-dynamically-php/1/

Grazie ancora per la disponibilità.  :bye:

risposto 7 anni fa
usecram
modificato 7 anni fa
X 0 X

Sembra interessante, ma è necessario che sul serve ci siano quelle "estensioni" altrimenti....

risposto 7 anni fa
LonelyWolf
X 0 X

Ho letto la prima pagina perché ieri sera ero davvero esausto  :buck: e l'articolo in inglese non mi aiutava di certo...il tempo di capire che non occorre installare PEAR e di provare il primo esempio (che funziona alla grandissima). Perdona l'ignoranza quali sono le estensioni necessarie?

risposto 7 anni fa
usecram
X 0 X

Io ho letto solo le prime righe e mi sembrava necessario che sul server fossero installate le librerie PEAR ( PEAR::Archive_Zip e PEAR::Archive_Tar package).

risposto 7 anni fa
LonelyWolf
X 0 X

Mi era preso un colpo! Ho detto: vuoi vedere che non va bene nemmeno questo??

Confermo basta scaricare la classe principale pear.php e quella per zippare, nessuna installazione.

 O0 :bye:

[OT]Ohhhh sono diventato membro junior![/OT]

risposto 7 anni fa
usecram
modificato 7 anni fa
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda