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:
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:
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:
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:
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());
    }
}
 
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:
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?
 
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:
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);
}
 
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
 
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