Cercando di scaricare Blob tramite PHP / MySQL

Questo è uno che non riesco a capire: ho creato con successo una function di caricamento su una pagina web per caricare i file su un database MySQL. Quando vado sul server e li apro tramite phpMyAdmin, sembrano tutti bene … txt, jpg, pdf, ecc.

Tuttavia, dopo aver assemblato QUESTA cosa (sotto) per scaricarlo, ho uno strano problema: tutti i documenti di text (e tutti gli altri tipi di file, dopo aver cambiato l'estensione in "txt") contengono il codice HTML della pagina stessa , seguito dal contenuto originale!

Inoltre, i diversi browser vengono visualizzati in modo diverso dopo il POST. Durante il tentativo di scaricare un file txt, IE mostrerà i dati corretti nell'ECO sulla pagina stessa (nessun download) con un messaggio di errore subito prima di esso:

Attenzione: l'intestazione non può contenere più di una singola intestazione, viene rilevata una nuova linea. in C: \ wamp \ www \ ace \ dmain.php sulla row 82.

La row 82 è 'intestazione ("Lunghezza contenuto …"

Né Firefox né Chrome mostrano nulla. Mi permettono solo di scaricarlo.

Ecco il codice:

<?php if (isset($_POST['downloadid'])) { $fileid = $_POST['downloadid']; try { $sql = "SELECT * FROM `datastore` WHERE `id` = '".$fileid."'"; $results = $pdo->query($sql);echo $sql; while ($row = $results->fetch()) { $filename = $row['filename']; $mimetype = $row['mimetype']; $filedata = $row['filedata']; header("Content-length: strlen($filedata)"); header("Content-type: $mimetype"); header("Content-disposition: download; filename=$filename"); //disposition of download forces a download echo $filedata; // die(); } //of While } //try catch (PDOException $e) { $error = '<br>Database ERROR fetching requested file.'; echo $error; die(); } //catch } //isset ?> 

Questo:

 header("Content-length: strlen($filedata)"); 

Non produrrà ciò che ti aspetti. Se si guardano le intestazioni in wireshark o un altro metodo per visualizzare la richiesta, si vedrà che non contiene un numero integer.

Usa questo invece:

 header("Content-length: ".strlen($filedata)); 

Dopo aver agonizzato per averlo risolto sul posto (cioè sulla stessa pagina con il resto del codice html e del codice), ho deciso di spostarlo su una pagina PHP dedicata. Dopo ciò, ha funzionato bene.

Grazie per i commenti!

ecco un buon esempio e fonte completa