RISOLTO (PHP) Nascondere la url di un file da scaricare...

  • Autore discussione Autore discussione jNash
  • Data d'inizio Data d'inizio
Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Ho usato il tuo codice, ma mi scarica un file che non trovo nelle cartelle e poi ovviamente non lo apre...
Ad es. chi è sys_get_temp_dir(), $size e $nome_utente? Manca un pezzo prima credo....
 
Ho la sensazione che stai facendo tutto copia e incollando "roba"... ?

Ho usato nomi esplicativi, chiaro che non potevi copiare il mio senza modificare nulla.
$size, è la dimensione del file che ottieni da filesize().
$nome_utente è il nome dell'utente collegato, ma puoi anche non usarlo e dare un nome generico allo zip (era per rispecchiare quanto facevi tu.
sys_get_temp_dir(), cito dalla doc "Returns directory path used for temporary files".
E' chiaro che non lo trovi, ho usato unlink(), quindi viene eliminato dopo il download.
 
No, unlink() l'ho commentato perché volevo capire cosa accadeva, prima di eliminare il file :)
Non ho verificato subito tutte le altre variabili...poi ci ho ragionato...

Edit: sono riuscito a generare il file "archivio.zip" dove mi serve e cioè in //DIR, adesso devo solo aprirlo con il blocco degli header.
 
Quindi sapendo il link che è uguale per tutti ("archivio" o il nome utente che è conosciuto) potrei riuscire a scaricare l'archivio degli altri con la giusta tempistica?
E se in 2 richiedolo l'archivio contemporaneamente (se usi "archivio")?
 
Quindi sapendo il link che è uguale per tutti ("archivio" o il nome utente che è conosciuto) potrei riuscire a scaricare l'archivio degli altri con la giusta tempistica?
E se in 2 richiedolo l'archivio contemporaneamente (se usi "archivio")?
No, nella mia idea, ancora da terminare, quando richiedo archivio.zip, questo si popola all'istante con i files dell'utente che li sta richiedendo. Non c'è possibilità di scaricare files di altri. Una volta scaricato, l'archivio si cancella e l'utente che arriva dopo è pronto per scaricare il suo...
 
Sto provando a portare avanti entrambe le cose, ossia 1) un elenco con i file che PIPPO può scaricare uno ad uno, mascherando la "url" di ogni file per non risalire ai file analoghi di un altro utente (banalmente devo camuffare lo username che passo via get), non volendo modificare il nome file condiviso e 2) mettere a disposizione un archivio.zip che contenga tutti i file dell'utente.
Per 1) al momento sono fermo. Servirebbe una funzione invertibile username<-->numero.
Per 2) sono riuscito a scaricare il file zip creato, tramite:
print '<script language="JavaScript"> window.location="dir/archivio.zip";</script>'
però poi non riesco a rimuovere il file, in quanto unlink($file) lo rimuove prima di lasciarmelo scaricare.
Non sono riuscito a scaricare il file tramite header...readfile, in tutti i modi lo scarica, ma non lo apre....eppure il file esiste e dalla condivisa lo apro!


Edit: non apro nemmeno questo o_O

PHP:
$file = 'top.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
Dove ovviamente top.gif e lo script php stanno nella stessa cartella!
La cartella è una condivisa con full control solo per alcuni utenti.
Ci saranno problemi di accesso? Non posso allargare i permessi....
 
Ultima modifica:
Mah...
Continuo a non capire perchè non hai seguito quanto ti dicevo sopra. Avevi meno della metà di questi problemi e semplificavi tutto.

Dovresti postare anche la parte dove fai l'unlink, altrimenti è difficile capire il motivo.
Alla readfile probabilmente il path devi passarlo assoluto e non relativo, è per questo che non ti funziona.
 
Mah...
Continuo a non capire perchè non hai seguito quanto ti dicevo sopra. Avevi meno della metà di questi problemi e semplificavi tutto.

Dovresti postare anche la parte dove fai l'unlink, altrimenti è difficile capire il motivo.
Alla readfile probabilmente il path devi passarlo assoluto e non relativo, è per questo che non ti funziona.
Perché senza scomodare ulteriori funzioni, tipo md5, ho praticamente risolto.
Path assoluto come lo indico? Ho provato di tutto, ma scarica, e poi non apro.
L'archivio esiste e dalla condivisa di rete va! Dal browser no...
I link li ho risolti in altro modo, in chiaro passo solo il nome file e basta. Adesso devo solo poter scaricare lo zip.

L'archivio lo genero nella stessa cartella dove c'è lo script.php.
Si genera perfettamente e come detto, dalla rete lo apro (ho i privilegi full control sulla cartella ).
PHP:
$zip = new ZipArchive();
$nomeZip = "archivio.zip"; // Cioè lo genero nella root
// Con un ciclo for popolo lo Zip
//...
$zip->addFile("dir/utente/files"); // archivio.zip è dentro la root, ma i file da aggiungere sono in "dir/utente"
//...
$zip->close();

header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"". basename($nomeZip) ."\"");
readfile ($nomeZip);
exit();

Dalla rete apro lo Zip perfettamente, dal web, lo scarico e mi dà "impossibile aprire la cartella. Zip non valido".
 
Ultima modifica:
E' sufficiente che utilizzi il codice che avevo postato l'altro giorno:

PHP:
header('Content-Type: application/zip');
header('Content-Length: ' . $size);
header('Content-Disposition: attachment; filename="File_' . $nome_utente . '.zip"');
readfile($file);

modifica solo in base ai nomi delle tue variabili.
Il path assoluto al file è qualcosa tipo var/www/nomeprogetto/files/file.zip, per farmi capire. Non sono più abituato ad utilizzare PHP senza un framework sotto, quindi non ricordo come si faccia "in automatico"... dai un occhio a __DIR__, oppure cerca online. Altrimenti lo hardcodi tu (non è una buona pratica).

Se fai ciò che ti ho mostrato in precedenza non hai nemmeno questo problema...
PHP:
$file = tempnam(sys_get_temp_dir(), "zip");
$zip = new \ZipArchive();
$zip->open($file, \ZipArchive::OVERWRITE);

// add files...
// close zip

header('Content-Type: application/zip');
header('Content-Length: ' . $size);
header('Content-Disposition: attachment; filename="File_' . $nome_utente . '.zip"');
readfile($file);
unlink($file);

Ti è sufficiente aggiungere la prima riga in sostanza.

E ti consiglio anche di eliminare gli zip che crei, se ogni volta li generi differenti.
 
Mi sembra un tornare indietro rispetto al mio codice, dove per lo meno arrivo a popolarlo e crearlo lo zip.
Poi non lo legge però...dal browser.
Non credo sia un problema di codice, piuttosto di dirgli dove è il file...ho provato anche con un percorso tipo var/www/nomeprogetto/files/file.zip non cambia nulla.
Grazie comunque per il tuo tempo.

Non riuscendo a leggerlo tramite readfile(), al momento ho optato per un
PHP:
print("<div align=\"center\">Archivio in download!<br><br><a href=\"http:IP/script.php\" target=\"_blank\">Torna indietro</a>\n");


print ("<script language=\"JavaScript\"> window.location=\"archivio.zip\";</script>");
Così facendo scarico lo Zip che si apre perfettamente e tramite link torno alla pagina precedente.
Però devo ancora capire come rimuovere lo zip, visto che non mi serve tenerlo.
 
Ultima modifica:
script.php
PHP:
$zip = new \ZipArchive();
$nomeZip = "archivio.zip";
// For per popolare l'archivio
$zip->addFile("file.txt");
//....
$zip->close();
$size = filesize($nomeZip);
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="File_' . $utente. '.zip"');
header('Content-Length: ' . $size);
readfile($nomeZip);
exit();

"Impossibile aprire la cartella"
$utente = "PIPPO";
script.php e archivio.zip sono nella stessa cartella.
\\IP_server\root\archivio.zip si apre perfettamente!

$size restituisce l'esatta dimensione dell'archivio....
 
Ultima modifica:
Ecco l'inghippo!

Ho provato commentando parti di codice di script.php fino ad arrivare a trovare il punto focale!
Ciò che impedisce l'apertura dal browser, dopo il download del file zip perfettamente creato, è questa stringa:

PHP:
include "connessione_db.php";

//che altro non è che:

<?php
/*Connessione db*/
    $host = 'IP SERVER';
    $user = 'nome_utente';
    $password = 'password_utente';
    $database = 'NOMEDB';
    $db = mysqli_connect($host, $user, $password, $database)
    or die ("Attenzione: impossibile connettersi al server $host");
    mysqli_select_db($db, $database)
    or die ("Attenzione: impossibile connettersi al database $database");
?>

Che utilizzo per fare la query prima di popolare il file ZIP!
Non ci sarei mai arrivato e non so perché non permetta di aprire lo zip...
 
Risolto copiando la chiamata al DB direttamente nello script e non tramite include.
Sistemati entrambi i problemi (link singolo e archivio zip).
Grazie a tutti per gli interventi.
 
Riapro la discussione perché vorrei apportare una modifica.

Es. di files da comprimere e scaricare

\\ip\anno\mese\giorno\cognome\aaa
\\ip\anno\mese\giorno\cognome\bbb
...

Scarico uno zip chiamato come voglio al cui interno c'è tutto il percorso assoluto \\ip\anno\mese\giorno\cognome\ e poi l'elenco dei files aaa e bbb contenuti.

Vorrei evitare di mostrare tutto il percorso, semplicemente scaricando uno zip del tipo \\cognome\ al cui interno ci sono aaa e bbb.

E' possibile?

il codice che uso è:
PHP:
$zip = new \ZipArchive();
$nomeZip = 'nomezip.zip';  //il file viene creato nella root.
$zip->open($nomeZip, \ZipArchive::OVERWRITE);
if ($zip->open($nomeZip, ZIPARCHIVE::CREATE) !== TRUE) {
exit("impossibile creare il file zip");
}

//ciclo for per popolare lo zip...mediante
$zip->addFile("ip/anno/mese/giorno/cognome");
$zip->close();

//e poi scarico lo zip...mediante

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"" . basename($nomeZip) . "\"");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($nomeZip));
readfile($nomeZip);
unlink($nomeZip);
exit;

Tnx!
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top