2009-10-16 6 views
2

J'ai récemment posé et résolu une question concernant le chargement de fichiers .PDF de plus de 2 Mo dans une base de données MySQL en tant que BLOBS. J'ai dû modifier certains paramètres dans mon fichier php.ini et MySQLs paramètres de paquet maximum. Cependant, la résolution de ce problème m'a amené à découvrir un nouveau problème avec mon script.Téléchargement BLOB tronqué à 1 Mo Script fonctionne pour les fichiers moins de 1 Mo

Maintenant que je peux télécharger des fichiers dans ma base de données BLOB, j'ai essayé de télécharger le fichier à des fins de test. À mon grand désarroi quand je suis allé ouvrir le fichier .PDF j'ai reçu l'erreur suivante: Impossible de charger le document (erreur 3) 'file: ///tmp/test-13.pdf'. Après une enquête plus approfondie, j'ai découvert que le fichier en cours de téléchargement, test.pdf, était seulement 1 Mo, un peu moins de la moitié de sa taille supposée dans la base de données d'un peu plus de 2 Mo. C'est évidemment la raison de l'erreur.

Le code suivant est la partie de mon script que j'utilise pour télécharger des fichiers de la base de données. Il est au sommet du script et fonctionne parfaitement pour les fichiers de moins de 1 Mo.

foreach($_REQUEST as $key => $value) 
{ 
if ($value == 'Open') 
    { 
    header(); 
    session_start(); 
    $dbh = new PDO('mysql:host='.$_SESSION['OpsDBServer'].'.ops.tns.its.psu.edu; 
      dbname='.$_SESSION['OpsDB'], $_SESSION['yoM'], $_SESSION['aMa']); 
    $id = $key; 
    $sqlDownload = "SELECT name, type, content, size FROM upload WHERE 
    id='".$id."'"; 
    $result = $dbh->query($sqlDownload); 

    $download = $result->fetchAll(); 
    $type = $download[0]['type']; 
    $size = $download[0]['size']; 
    $name = $download[0]['name']; 
    $content = $download[0]['content']; 

    header("Content-type: $type"); 
    header("Content-Disposition: inline; filename=$name"); 
    header("Content-length: $size"); 
    header("Cache-Control: maxage=1"); 
    header("Pragma: public"); 

    echo $content; 

    exit; 
    } 
} 

Je pense que peut-être que j'ai quelques déclarations d'en-tête mal? Je suis très confus au sujet de ce qu'il faut faire. J'ai recherché php.ini et je n'ai trouvé aucun paramètre que je pense devoir changer et mon arrangement maximum de paquet pour MySQL est 4 MB donc un téléchargement de 2 MB.

Merci pour toute aide.

+0

Avez-vous revérifié que * taille * est correctement définie dans votre base de données? –

+0

Je n'ai pas vérifié, mais je le ferai quand je serai de retour au travail lundi. – dbaugh

Répondre

2

En fait, je résolu le problème. J'ai changé toutes les valeurs qui étaient recommandées ici dans php.ini et my.cnf mais j'avais aussi besoin de changer un paramètre pour PDO.

J'ai changé: PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE (entier) Taille maximale du tampon. La valeur par défaut est 1 MiB.

Cela doit être défini lorsque l'objet PDO est créé pour fonctionner. Tout va bien maintenant.

2

Selon (http://dev.mysql.com/doc/refman/5.0/en/blob.html):

The maximum size of a BLOB or TEXT object is determined by its type, but the largest value you actually can transmit between the client and server is determined by the amount of available memory and the size of the communications buffers. You can change the message buffer size by changing the value of the max_allowed_packet variable, but you must do so for both the server and your client program.

Selon (http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html) la valeur par défaut de max_allowed_packet est 1048576.

+0

J'ai déjà demandé à l'administrateur de la base de données de modifier la valeur de max_allowed_packet du côté serveur à 4 Mo. Y a-t-il quelque chose que je dois changer du côté des clients? – dbaugh