scaricare file da un database

bastian_5

Nuovo Utente
1 Mar 2012
8
0
0
ciao a tutti sto creando un sito dove è possibile scaricare dei file txt,pdf, word, exel che vengono caricati dagli utenti...
Il problema è il download perchè l'upload funziona e carico i file come medimblob...
i codici sono:

index.php
PHP:
Appunto: <?
$getid=$_GET['id'];
$result = mysql_query("SELECT * FROM tabella_appunto where id='$getid'");

while($row = mysql_fetch_array($result)){
$file = $row['appunto'];
}
echo "<a href=\"download.php?file={$file}\">".$riga["nome"]."</a><br />";?>

Qui è dove passo il mio file alla pagina download che dovrebbe scaricare i file...

download.php

PHP:
<?php
function download($file) {
$file = realpath($file);
if(headers_sent()) {
echo "Headers già inviati!";
return false;
} 
else if(!file_exists($file)) {
echo "Il file da scaricare è inesistente!";
return false;
}
$mime_types = array(
"exe" => "application/octet-stream",
"html" => "text/html",
"ico" => "image/x-icon",
"jpeg" => "image/jpeg",
"png" => "image/png",
"jpg" => "image/jpeg",
"txt" => "text/plain",
);
$bytes = filesize($file);
$info = pathinfo($file);
$ext = strtolower($info["type"]);
$mt = isset($mime_types[$ext]) ? $mime_types[$ext] : "application/octet-stream";

header("Content-Transfer-Encoding: binary"); 
header("Content-Type: {$mt}");
header("Content-disposition: attachment; filename=" . $info["appunto"] . "." . $info["type"]);
header("Content-length: {$bytes}");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
return readfile($file);
} 
if(isset($_GET["file"])) {
$file = str_replace(array(".", ".."), null, $_GET["appunto"]);
download($file);
} 
?>


grazie in anticipo per l'aiuto spero di essere stato chiaro...
 
Ultima modifica di un moderatore:

bastian_5

Nuovo Utente
1 Mar 2012
8
0
0
La funzione readfile stampa il contenuto di un file, non lo restituisce. Usa file_get_contents.

grazie per la risposta ma nn va ancora mi scarica un file di nome download...

PHP:
<?php
 	function download($file){
    $file=realpath($file);
    if(headers_sent()) {
        echo "Headers già inviati!";
        return false;
    } 
	else if(!file_exists($file)) {
        echo "Il file da scaricare è inesistente!";
        return false;
    }
    $mime_types = array(
        "exe" => "application/octet-stream",
        "html" => "text/html",
        "doc" => "application/msword",
        "pdf" => "application/pdf",
        "png" => "image/png",
        "jpg" => "image/jpeg",
        "txt" => "text/plain",
     );
    $bytes = filesize($file);
    $info  = pathinfo($file);
    $ext = strtolower($info["type"]);
    $mt = isset($mime_types[$ext]) ? $mime_types[$ext] : "application/octet-stream";

    header("Content-Transfer-Encoding: binary"); 
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename=" . $info["appunto"] . "." . $info["type"]);
    header("Content-length: {$bytes}");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Pragma: public");
    return readfile($file);
	file_get_contents($file);
 }
if(isset($_GET["file"])) {
    $file = str_replace(array(".", ".."), null, $_GET["appunto"]);
    download($file);
}  
?>

è giusto come l'ho inserito??? grazie
 
Ultima modifica di un moderatore:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
Prova così. Ho dato una sistemata al codice e usato le eccezioni per gli errori:
PHP:
<?php
function download($file, $path = '.')
{
    $file = realpath($file);

    if (!is_file($file)) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" does not exist.',
            $file
        ));
    }

    $path = realpath($path);

    if (dirname($file) != $path) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" is not located in "%s".',
            $file,
            $path
        ));
    }

    if (headers_sent()) {
        throw new LogicException('Headers have been already sent.');
    }

    $mimeTypes = array(
        'exe'  => 'application/octet-stream',
        'html' => 'text/html',
        'doc'  => 'application/msword',
        'pdf'  => 'application/pdf',
        'png'  => 'image/png',
        'jpg'  => 'image/jpeg',
        'txt'  => 'text/plain',
    );

    $bytes = filesize($file);
    $info  = pathinfo($file);
    $ext   = strtolower($info['extension']);
    $type  = isset($mimeTypes[$ext]) ? $mimeTypes[$ext] : 'application/octet-stream';

    header('Content-Transfer-Encoding: binary');
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename={$info['basename']}.{$info['extension']}");
    header("Content-length: {$bytes}");
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    readfile($file);
}

if (isset($_GET['file'])) {
    try {
        download($_GET['file']);
    } catch (Exception $e) {
        die('Errore: impossibile completare la richiesta.');
    }
}
Dovresti studiare PHP5: il tuo codice era preistorico.

Ho anche aggiunto un secondo parametro, che deve essere il percorso in cui sono contenuti i file. In questo modo ti puoi assicurare che qualche malintenzionato non cerchi di scaricare file di sistema usando il percorso assoluto.
 
Ultima modifica:

bastian_5

Nuovo Utente
1 Mar 2012
8
0
0
Prova così. Ho dato una sistemata al codice e usato le eccezioni per gli errori:

Dovresti studiare PHP5: il tuo codice era preistorico.

Ho anche aggiunto un secondo parametro, che deve essere il percorso in cui sono contenuti i file. In questo modo ti puoi assicurare che qualche malintenzionato non cerchi di scaricare file di sistema usando il percorso assoluto.

Ti ringrazio per la risposta... ma nn funziona ancora :( continua ad uscire Errore: impossibile completare la richiesta. che è nel codice.
So che il mio codice era preistorico è che sono alle prime armi nella creazioni di siti ti ringrazio ancora per l'aiuto

download.php

PHP:
<?php
function download($file, $path = '.')
{
    $file = realpath($file);

    if (!is_file($file)) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" does not exist.',
            $file
        ));
    }

    $path = realpath($path);

    if (dirname($file) != $path) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" is not located in "%s".',
            $file,
            $path
        ));
    }

    if (headers_sent()) {
        throw new LogicException('Headers have been already sent.');
    }

    $mimeTypes = array(
        'exe'  => 'application/octet-stream',
        'html' => 'text/html',
        'doc'  => 'application/msword',
        'pdf'  => 'application/pdf',
        'png'  => 'image/png',
        'jpg'  => 'image/jpeg',
        'txt'  => 'text/plain',
    );

    $bytes = filesize($file);
    $info  = pathinfo($file);
    $ext   = strtolower($info['type']);
    $type  = isset($mimeTypes[$ext]) ? $mimeTypes[$ext] : 'application/octet-stream';

    header('Content-Transfer-Encoding: binary');
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename={$info['appunto']}.{$info['type']}");
    header("Content-length: {$bytes}");
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    readfile($file);
}

if (isset($_GET['file'])) {
    try {
        download($_GET['file']);
    } catch (Exception $e) {
        die('Errore: impossibile completare la richiesta.');
    }
}
?>

questo è il codice che ho inserito modificando 2 parametri per vedere se andava perchè col tuo mi da sempre Errore: impossibile completare la richiesta. e anche adesso nn capisco dove sia l'errore ciao grazie
 
Ultima modifica di un moderatore:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
Ritorna al mio codice ($info['appunto'] non esiste) e modifica così:
PHP:
<?php
function download($file, $path = '.')
{
    $file = realpath($file);

    if (!is_file($file)) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" does not exist.',
            $file
        ));
    }

    $path = realpath($path);

    if (dirname($file) != $path) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" is not located in "%s".',
            $file,
            $path
        ));
    }

    if (headers_sent()) {
        throw new LogicException('Headers have been already sent.');
    }

    $mimeTypes = array(
        'exe'  => 'application/octet-stream',
        'html' => 'text/html',
        'doc'  => 'application/msword',
        'pdf'  => 'application/pdf',
        'png'  => 'image/png',
        'jpg'  => 'image/jpeg',
        'txt'  => 'text/plain',
    );

    $bytes = filesize($file);
    $info  = pathinfo($file);
    $ext   = strtolower($info['extension']);
    $type  = isset($mimeTypes[$ext]) ? $mimeTypes[$ext] : 'application/octet-stream';

    header('Content-Transfer-Encoding: binary');
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename={$info['basename']}.{$info['extension']}");
    header("Content-length: {$bytes}");
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    readfile($file);
}

if (isset($_GET['file'])) {
    try {
        download($_GET['file']);
    } catch (Exception $e) {
        die($e->getMessage());
    }
}
 

bastian_5

Nuovo Utente
1 Mar 2012
8
0
0
Ritorna al mio codice ($info['appunto'] non esiste) e modifica così:
PHP:
<?php
function download($file, $path = '.')
{
    $file = realpath($file);

    if (!is_file($file)) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" does not exist.',
            $file
        ));
    }

    $path = realpath($path);

    if (dirname($file) != $path) {
        throw new InvalidArgumentException(sprintf(
            'The file "%s" is not located in "%s".',
            $file,
            $path
        ));
    }

    if (headers_sent()) {
        throw new LogicException('Headers have been already sent.');
    }

    $mimeTypes = array(
        'exe'  => 'application/octet-stream',
        'html' => 'text/html',
        'doc'  => 'application/msword',
        'pdf'  => 'application/pdf',
        'png'  => 'image/png',
        'jpg'  => 'image/jpeg',
        'txt'  => 'text/plain',
    );

    $bytes = filesize($file);
    $info  = pathinfo($file);
    $ext   = strtolower($info['extension']);
    $type  = isset($mimeTypes[$ext]) ? $mimeTypes[$ext] : 'application/octet-stream';

    header('Content-Transfer-Encoding: binary');
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename={$info['basename']}.{$info['extension']}");
    header("Content-length: {$bytes}");
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    readfile($file);
}

if (isset($_GET['file'])) {
    try {
        download($_GET['file']);
    } catch (Exception $e) {
        die($e->getMessage());
    }
}

Manco questo codice va... mi dice che il file nn esiste sul mio sito...
io carico i file come mediumblob... ma i file sono presenti nel database se guardo con il phpadmin
poi una cosa header("Content-disposition: attachment; filename={$info['basename']}.{$info['extension']}");
il basename dove lo prende???
ciao grazie ancora
 
Ultima modifica:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
Mi rendo conto solo ora che i file sono nel database... Come può funzionare così, scusa? La funzione legge un file dal filesystem, non dal database.
Bisogna riscriverla in modo che usi i dati del database. Quali campi hai nella tabella?
 

bastian_5

Nuovo Utente
1 Mar 2012
8
0
0
Mi rendo conto solo ora che i file sono nel database... Come può funzionare così, scusa? La funzione legge un file dal filesystem, non dal database.
Bisogna riscriverla in modo che usi i dati del database. Quali campi hai nella tabella?

Codice:
CREATE TABLE `tabella_appunto` (
  `user_id` int(255) NOT NULL,
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `size` varchar(255) NOT NULL,
  `type` varchar(255) NOT NULL,
  `appunto` mediumtext NOT NULL,
  `titolo` varchar(255) NOT NULL,
  `contatto` varchar(255) NOT NULL,
  `user_username` varchar(11) NOT NULL,
  `nome` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
)

ecco la tabella grazie ciao
 
Ultima modifica di un moderatore:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
Ammesso che:
  • type contenga il mime type del file;
  • size la sua dimensione in byte;
  • nome il nome comprensivo dell'estensione;
  • appunto il contenuto (dev'essere MEDIUMBLOB, non MEDIUMTEXT);
La funzione è:
PHP:
<?php

function download(array $data)
{
    header('Content-Transfer-Encoding: binary');
    header("Content-Type: {$data['type']}");
    header("Content-disposition: attachment; filename={$data['nome']}");
    header("Content-length: {$data['size']}");
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    echo $data['appunto'];
}

if (isset($_GET['file'])) {
    // recupera i dati del file e salvali in $data
    // ...

    download($data);
}
 

bastian_5

Nuovo Utente
1 Mar 2012
8
0
0
Ammesso che:
  • type contenga il mime type del file;
  • size la sua dimensione in byte;
  • nome il nome comprensivo dell'estensione;
  • appunto il contenuto (dev'essere MEDIUMBLOB, non MEDIUMTEXT);
La funzione è:
PHP:
<?php

function download(array $data)
{
    header('Content-Transfer-Encoding: binary');
    header("Content-Type: {$data['type']}");
    header("Content-disposition: attachment; filename={$data['nome']}");
    header("Content-length: {$data['size']}");
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    echo $data['appunto'];
}

if (isset($_GET['file'])) {
    // recupera i dati del file e salvali in $data
    // ...

    download($data);
}


si è mediumblob ho copiato quella vecchia... cmq se io gli passo questo alla pagina download.php
PHP:
Appunto: <?
$getid=$_GET['id'];
$result = mysql_query("SELECT * FROM tabella_appunto where id='$getid'");

while($row = mysql_fetch_array($result)){
$file = $row['appunto'];
}
echo "<a href=\"download.php?file={$file}\">".$riga["nome"]."</a><br />";?>
e modificando i campi ovvero sostituendo $data con $file o viceversa nn funziona ugualmente... mi dice Errore HTTP 500 (Internal Server Error): Si è verificata una condizione imprevista durante il tentativo del server di soddisfare la richiesta.

Grazie per l'aiuto
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
26
Roma
alessandro1997.netsons.org
A parte che puoi scrivere più semplicemente:
PHP:
Appunto:
<?php
$getid = $_GET['id']; 
echo "<a href=\"download.php?file={$getid}\">scarica file</a><br />";
?>

E poi nel file download.php, basandoti sull'ID, devi recuperare i dati e passarli alla funzione.
 
Discussioni simili
Autore Titolo Forum Risposte Data
Phyro modificarne il contenuto e alla fine scaricare il file .txtl HTML e CSS 1
L cUrl per scaricare file PHP 1
M Scaricare file Xml dal Web sul Proprio ftp possibile? PHP 0
F Scaricare file su server da un altro server PHP 1
T nascondere percorso di file da scaricare PHP 3
J Scaricare fotom da file xml PHP 0
T [PHP] inserire un file pdf da poter far scaricare... PHP 22
B Scaricare file xml dopo autenticazione http PHP 1
max_400 Scaricare file senza la richiesta da parte del browser PHP 10
S scaricare dei file mp3 da un sito fatto in flash Flash 2
A scaricare file con php PHP 10
G [HTML] Scaricare file excel HTML e CSS 9
G Scaricare file.php PHP 4
I Dove scaricare file csv localité italiane? Database 2
virtuale Scaricare miei file mp3 dal sito HTML e CSS 2
N Scaricare file dal sito? HTML e CSS 5
L scaricare MySQL MySQL 2
D [ASP] scaricare articoli Classic ASP 8
momeraths [HTML] Come non far scaricare video HTML e CSS 1
G Fare scaricare con M.O. solo la posta nuova. Posta Elettronica 3
trattorino [PHP] Scaricare solo utenti online o di un determinato tempo PHP 4
trattorino [PHP] Scaricare utenti che hanno due tabelle con dati uguali PHP 15
trattorino [PHP] Scaricare utenti che hanno due tabelle con dati uguali PHP 0
R Scaricare posta Windows e Software 7
M che installer di PHP 7 devo scaricare? PHP 5
A APP per scaricare documento XML e visualizzarlo all'interno dell'applicazione Sviluppo app per Android 1
filippino Scaricare caratteri per libretto chiesa Webdesign e Grafica 1
D Scaricare database MYSql con una funzione MySQL 0
StarFish Scaricare vecchie release Knoppix Linux e Software 0
G Scaricare kml da una mappa incorporata in un sito web HTML e CSS 5
Marcolotto Scaricare musica da YouTube Discussioni Varie 4
L jquery ui , Quale versione da scaricare? jQuery 0
F problemi scaricare joomla Joomla 3
D Come un utente può scaricare un immagine presente in un db PHP 3
W Ubuntu si puo scaricare Windows e Software 2
E leggere email anche quelle già lette, scaricare eventuali allegati PHP 0
F Plugin per scaricare PDF e gestione utenti in wordpress WordPress 1
W MAMP - configurare PHP per scaricare la posta POP3 PHP 1
M scaricare i records di una tuabella su i rispettivi array PHP 1
Web Designer Lista Plugin per Wordpress da scaricare gratis! WordPress 0
Web Designer Risorse dove poter scaricare applicazioni per i vari sistemi operativi gratis Sviluppo app per iOS 0
novello88 Installous iPad: scaricare gratis app per iPad Smartphone e tablet 1
V Salvare un contatto (mail) in memoria e rispondere con il contenuto da scaricare PHP 3
M Scaricare foto da messaggi email PHP 5
N filezilla non mi permette di scaricare Web Server 6
MarcoGrazia 80% quasi finito di scaricare.... Discussioni Varie 3
F Scaricare i video da YouTube Social Media Marketing 4
A vuoi scaricare gratis software Autodesk? Windows e Software 1
H Scaricare video da youtube e co. con php PHP 9
G Come non far scaricare immagini da sito html Javascript 5

Discussioni simili