Ceci est un que je ne peux pas comprendre: J'ai réussi à construire une fonction de téléchargement sur une page Web pour télécharger des fichiers vers une base de données MySQL. Quand je vais sur le serveur et les ouvre via phpMyAdmin, ils ont tous l'air bien ... txt, jpg, pdf, etcEssayer de télécharger Blob via PHP/MySQL
Pourtant, après avoir mis ensemble cette chose (ci-dessous) pour le télécharger, je reçois un problème étrange : Tous les documents texte (et tous les autres types de fichiers, après avoir changé l'extension en 'txt') contiennent du code HTML de la page elle-même, suivi du contenu original!
De plus, différents navigateurs s'affichent différemment après le POST. Lorsque vous essayez de télécharger un fichier txt, IE affiche les données correctes dans l'ECHO sur la page elle-même (pas de téléchargement) avec un message d'erreur juste avant:
Avertissement: En-tête ne peut pas contenir plus d'un en-tête , nouvelle ligne détectée. dans C: \ wamp \ www \ ace \ dmain.php sur la ligne 82.
Ligne 82 est 'en-tête ("Content-longueur ...'
Ni Firefox, ni Chrome montrent tout ce qu'ils juste. permettez-moi de le télécharger
Voici le code:.
<?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
?>
Yikes. Vous n'utilisez pas de paramètres de liaison PDO et _still_ et vous vous rendez vulnérable à l'injection SQL. ** S'il vous plaît ** (pour votre propre bien) regardez dans 'bindValue' et' prepare' sur PDO. Vous faites également écho au code SQL avant de modifier les en-têtes. Cela entraînera l'envoi des en-têtes à moins que la mise en mémoire tampon de sortie ne soit activée. –
Ouais ... je suis un mauvais garçon. C'est vraiment pour usage interne seulement pour un petit groupe d'employés, mais je comprends le point. Va réécrire ça. –
Même pour un usage interne, c'est important. Pas grand-chose d'empêcher un employé de partir en train de causer des dommages quand ils partent, si c'est ainsi que le code est écrit! J'essaie juste de t'aider. Mais vous savez mieux que moi dans votre organisation interne. –