2013-02-21 3 views
3

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 
?> 
+3

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. –

+0

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. –

+0

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. –

Répondre

6

Ce:

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

Ne va pas produire ce que vous attendez. Si vous regardez les en-têtes dans wireshark, ou une autre méthode pour voir la requête, vous verrez qu'elle ne contient pas d'entier.

Utilisez ce lieu:

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

Merci pour celui-là! Je ne reçois plus le message IE, mais tous les fichiers ont toujours le code HTML ajouté au début. Gak. –

+0

Votre code fait actuellement écho à l'instruction SQL, avez-vous une autre sortie avant de répercuter les données du fichier? – datasage

+0

J'ai supprimé l'écho $ sql après avoir posté ceci. Pas de chance. Il y a une autre sortie avant la balise

0

Après angoissante sur le fixer en place (qui est, sur la même page avec le reste du html et code), je décide de le déplacer vers un PHP dédié page. Après cela, ça a bien fonctionné.

Merci pour les commentaires!

Questions connexes